我目前正在尝试让 CXF Servlet 与常规 Web MVC Servlet 一起运行。我的 CXF Servlet 定义了多个端点,即:
/api/v1/*
/soap/v2/*
/internal-api/v1/*
我还希望 Spring MVC 的
DispatcherServlet
在 /api/v2/*
下运行
当我配置时:
@Bean
public ServletRegistrationBean<CXFServlet> cxfServlet() {
final ServletRegistrationBean<CXFServlet> cxfServletServletRegistrationBean = new ServletRegistrationBean<>(new CXFServlet(), "/*");
return cxfServletServletRegistrationBean;
}
有关 CXF 的所有内容都有效,但 Spring Boot 应用程序中的
@Controller
不再可用。(当然,现在所有内容都定向到 cxfservlet)
但是当我配置时:
@Bean
public ServletRegistrationBean<CXFServlet> cxfServlet() {
final ServletRegistrationBean<CXFServlet> cxfServletServletRegistrationBean = new ServletRegistrationBean<>(new CXFServlet(), "/api/v1/*");
return cxfServletServletRegistrationBean;
}
如果我使用这样的 url,则现在只能访问 cxf 的端点
http://localhost:8080/api/v1/api/v1/test
。
如何配置 spring boot 应用程序,以便
/api/v2/*
定向到 spring mvc servlet 并且 cxf servlet 仍然像上面描述的那样工作?
手动注册调度程序 servlet,而不是让 Spring Boot 自动配置来解决问题:
@Configuration
public class ServletConfig {
@Bean
public ServletRegistrationBean<CXFServlet> cxfServlet() {
return new ServletRegistrationBean<>(new CXFServlet(), "/*");
}
@Bean
public DispatcherServlet dispatcherServlet() {
DispatcherServlet dispatcherServlet = new DispatcherServlet();
dispatcherServlet.setThreadContextInheritable(true);
dispatcherServlet.setThrowExceptionIfNoHandlerFound(true);
return dispatcherServlet;
}
@Bean
public DispatcherServletRegistrationBean dispatcherServletRegistration() {
DispatcherServletRegistrationBean registration = new DispatcherServletRegistrationBean(
dispatcherServlet(),
"/api/v2/*"
);
registration.setLoadOnStartup(0);
registration.setName(DispatcherServletAutoConfiguration.DEFAULT_DISPATCHER_SERVLET_REGISTRATION_BEAN_NAME);
return registration;
}
}
请注意,在除
/*
之外的其他任何目录下注册 cxf servlet 都会破坏 cxf servlet 的路由。