将 CXF 与 Spring Boot Actuator 结合使用

问题描述 投票:0回答:5

我正在开发一个 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/*");
}
servlets spring-boot cxf
5个回答
1
投票

虽然我不知道原因,但当我设置如下所示的名称时,它就开始工作了。

@Bean
public ServletRegistrationBean cxfServlet() {
    ServletRegistrationBean cxf = new ServletRegistrationBean(new CXFServlet(), "/soap-api/*");
    cxf.setName("cxfServlet");
    return cxf;
}

1
投票

这是我使用的简单的 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 }) 

1
投票

我在使用 Kotlin 时遇到了同样的问题,这篇文章间接地帮助了我。我的代码是这样的

@Bean
fun dispatcherServlet(): ServletRegistrationBean<CXFServlet>? {
    return ServletRegistrationBean(CXFServlet(), "/*")
}

将方法名称从

dispatcherServlet
更改为
cxfServlet
后,执行器神奇地开始工作。

@Bean
fun cxfServlet(): ServletRegistrationBean<CXFServlet>? {
    return ServletRegistrationBean(CXFServlet(), "/*")
}

我猜它与某些 Spring 默认 servlet 冲突。


0
投票

我看起来 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 默认处理执行器指标的


0
投票

它对我有用

  @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;
    
  }
© www.soinside.com 2019 - 2024. All rights reserved.