我正在开发一个 Web 服务主机应用程序,其中使用 cxf 和 spring boot。当我使用以下代码注册 cxf servlet 时,Web 服务端可以工作,我可以看到已发布的 wsdls。
但是,在设置 cxf servlet Spring boot Actuator 和 Rest 端点之后,它无法工作并返回 404。我该如何解决这个问题?
@Bean
public ServletRegistrationBean cxfServlet() {
return new ServletRegistrationBean(new CXFServlet(), "/soap-api/*");
}
虽然我不知道原因,但当我设置如下所示的名称时,它就开始工作了。
@Bean
public ServletRegistrationBean cxfServlet() {
ServletRegistrationBean cxf = new ServletRegistrationBean(new CXFServlet(), "/soap-api/*");
cxf.setName("cxfServlet");
return cxf;
}
这是我使用的简单的 Spring Boot 配置。
@Configuration
@Import(value = { JaxRsConfig.class })
public class CxfRestConfig {
@Bean
public ServletRegistrationBean servletRegistrationBean() {
return new ServletRegistrationBean(new CXFServlet(), "/cxf/*");
}
@Component
public class CustomSpringComponentScanServer
extends AbstractSpringComponentScanServer {
@Override
protected String getAddress() {
return "/api";
}
@Bean
public Server jaxRsServer() {
super.getFeatures().add(new LoggingFeature());
return super.createJaxRsServer();
}
}
}
注意: 使用 ComponentScanner,您需要在类级别使用 Spring 注释和 @Path 注释来注释您的服务类。
如果你不想要http://localhost:8080/cxf中的api列表,你可以直接删除我编写的自定义类,然后直接导入,如下所示。
@Import(value = { JaxRsConfig.class, SpringComponentScanServer.class })
我在使用 Kotlin 时遇到了同样的问题,这篇文章间接地帮助了我。我的代码是这样的
@Bean
fun dispatcherServlet(): ServletRegistrationBean<CXFServlet>? {
return ServletRegistrationBean(CXFServlet(), "/*")
}
将方法名称从
dispatcherServlet
更改为cxfServlet
后,执行器神奇地开始工作。
@Bean
fun cxfServlet(): ServletRegistrationBean<CXFServlet>? {
return ServletRegistrationBean(CXFServlet(), "/*")
}
我猜它与某些 Spring 默认 servlet 冲突。
我看起来 servlet 之间存在冲突。
您可以在日志中查看。应该有:
2017-04-01 15:34:04,029 [restartedMain] INFO o.s.b.w.s.ServletRegistrationBean - Mapping servlet: 'CXFServlet' to [/soap-api/*]
2017-04-01 15:34:04,031 [restartedMain] INFO o.s.b.w.s.ServletRegistrationBean - Mapping servlet: 'dispatcherServlet' to [/]
应该正好有两个 servlet,并且路径应该不同。
如果缺少一个,则 enpoints 将不起作用。
dispatcherServlet
是 spring 默认处理执行器指标的
它对我有用
@Bean
@Primary
public DispatcherServletPath dispatcherServletPath() {
return () -> "";
}
@Bean
public DispatcherServlet dispatcherServletActuator() {
return new DispatcherServlet();
}
@Bean
public ServletRegistrationBean<CXFServlet> dispatcherServlet() {
ServletRegistrationBean<CXFServlet> cxf = new ServletRegistrationBean<>(new CXFServlet(), "/v1/*");
cxf.setName("cxfServlet");
return cxf;
}