一, 概述
因为项目需要, 需要再原先项目中发布或者调用 webService 服务, 考虑到集成 Springboot 框架, 于是采用 CXF 框架.
WebService 注册服务如下:
- @Configuration
- public class CxfWebServiceConfig {
- @Autowired
- private HelloWebService helloWebService;
- @Bean
- public ServletRegistrationBean dispatcherServlet() {
- return new ServletRegistrationBean(new CXFServlet(), "/service/*");// 发布服务名称
- }
- @Bean(name = Bus.DEFAULT_BUS_ID)
- public SpringBus springBus() {
- return new SpringBus();
- }
- public HelloWebService helloWebService(){
- return new HelloWebServiceImpl();
- }
- @Bean
- public Endpoint endpoint(){
- EndpointImpl endpoint = new EndpointImpl(springBus(),helloWebService);
- endpoint.publish("/HelloWebService");
- return endpoint;
- }
- }
在将 CXF 集成之后, WebService 服务能够正常访问, 但是原先的 http 服务不能访问
因为 springboot 程序中默认注册的是 dispatcherServlet, 在发不了 WebService 服务之后, 相当于手动配置 ServletRegistrationBean, 这时 springboot 不会再去注册默认的 dispatcherServlet, 解决办法就是需要我们在启动类里手动去注册一个 dispatcherServlet
spring boot 中注册 Servlet 的两种方式
但 spring boot 把 tomcat 都给隐藏了, 更别说 Web.xml 了. 好在提供了另外的方式配置 servlet.
[email protected] 注解:
这个是 javaee 的注解, 是 servlet3.0 以后提供的. spring boot 会扫描这个注解, 并将这个注解注解的类注册到 Web 容器中作为一个 servlet.
但是 DispatcherServlet 并不是自定义的 servlet, 而是框架提供的 servlet, 所以此方法不行.
2.ServletRegistrationBean:
这个 bean 是由 spring boot 提供专门来注册 servlet 的, 可以象注册 bean 一样去配置 servlet.
- @Bean
- public ServletRegistrationBean dispatcherServlet() {
- // 注解扫描上下文
- AnnotationConfigWebApplicationContext applicationContext = new AnnotationConfigWebApplicationContext();
- // 项目包名
- applicationContext.scan("com.surfilter.*");
- DispatcherServlet rest_dispatcherServlet = new DispatcherServlet(applicationContext);
- ServletRegistrationBean registrationBean = new ServletRegistrationBean(rest_dispatcherServlet);
- registrationBean.setLoadOnStartup(1);
- registrationBean.addUrlMappings("/*");
- // 一定要加上此行
- registrationBean.setName("rest_dispatcherServlet");
- return registrationBean;
- }
其中需要注意的是 registration.setName("rest_dispatcherServlet"), 这个语句很重要, 因为 name 相同的 ServletRegistrationBean 只有一个会生效, 也就是说, 后注册的会覆盖掉 name 相同的 ServletRegistrationBean.
如果不指定, 默认为 "dispatcherServlet" 而 spring boot 提供的 DispatcherServlet 的 name 就是 "dispatcherServlet". 可以在 spring boot 的 DispatcherServletAutoConfiguration 类中找到:
- public ServletRegistrationBean dispatcherServletRegistration(DispatcherServlet dispatcherServlet) {
- ServletRegistrationBean registration = new ServletRegistrationBean(dispatcherServlet, new String[]{this.serverProperties.getServletMapping()});
- registration.setName("dispatcherServlet");
- registration.setLoadOnStartup(this.webMvcProperties.getServlet().getLoadOnStartup());
- if(this.multipartConfig != null) {
- registration.setMultipartConfig(this.multipartConfig);
- }
- return registration;
- }
- }
所以为了不覆盖默认的 dispatcherServlet, 必须指定一个别的名称
来源: http://www.bubuko.com/infodetail-3456561.html