如何在 Spring Boot 中同时公开 SOAP Web 服务和 RESTful API?

Posted

技术标签:

【中文标题】如何在 Spring Boot 中同时公开 SOAP Web 服务和 RESTful API?【英文标题】:How to expose both a SOAP web-service and RESTful API at the same time in Spring Boot? 【发布时间】:2017-05-25 19:11:53 【问题描述】:

在 Spring Boot 1.4.3 中,我公开了一个 SOAP Web 服务端点,它在端口 8080 上成功运行。

为了运行健康检查,我还需要公开一个 RESTful API。我尝试使用执行器和休息控制器:

@RestController
public class RESTapis 

    @RequestMapping(method = RequestMethod.GET, RequestMethod.POST, value = "/health")
    public String healthCheck() 
        return "ACK";
    


但在这两种情况下,我都会得到相同的响应:HTTP 405(不允许的方法)

如果我禁用 Web 服务,REST api 将返回 HTTP 200。

如何让 SOAP Web 服务和 REST 同时工作?

这是网络服务配置:

@EnableWs
@Configuration
public class WebServiceConfig extends WsConfigurerAdapter 

    @Bean
    public ServletRegistrationBean messageDispatcherServlet(ApplicationContext applicationContext) 
        MessageDispatcherServlet servlet = new MessageDispatcherServlet();
        servlet.setApplicationContext(applicationContext);
        servlet.setTransformWsdlLocations(true);

        return new ServletRegistrationBean(servlet, "/*");
    

【问题讨论】:

你能展示你的 pom 和两个请求的例子吗? 【参考方案1】:

因此,关闭 messageDispatcherServlet 方法后,由于通配符注册,您似乎将 servlet 绑定到所有传入请求:

return new ServletRegistrationBean(servlet, "/*");

因此 MessageDispatcher 正在拦截所有传入的请求并尝试查找 /health 并抛出 http 405。

修复:

return new ServletRegistrationBean(servlet, "/soap-api/*");

说明:

通过将 Message Dispatcher 绑定到特定的 URI 命名空间,我们可以确保仅在 /soap-api/* 命名空间上触发的所有请求都会被 MessageDispatcher 拦截。所有其他请求都将被 DispatcherServlet 拦截,从而可以与您的 Soap WS 并行运行 Rest 接口。

建议:

不知道应用程序的原因/细节,但不知道方法 healthcheck() 的名称,您可以查看使用 spring boot actuator 为您的应用程序生成健康检查和指标。您还可以覆盖它以进行自定义。

执行器参考: https://spring.io/guides/gs/actuator-service/

【讨论】:

谢谢你,你也帮了我。

以上是关于如何在 Spring Boot 中同时公开 SOAP Web 服务和 RESTful API?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 JMX 将 Spring Boot 应用程序中的 Kafka 指标公开给 Prometheus?

如何从使用 Spring Cloud Eureka 服务器注册的 Spring Boot 应用程序中公开 Prometheus 指标

如何使用 Spring Boot 存储库配置公开超类的 Id

使用Spring Boot创建微服务

升级到 Spring Boot 2 后,如何向 prometheus 公开缓存指标?

在不使用 spring-boot 执行器的情况下将来自 spring 应用程序的指标公开给 prometheus