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

时间:2017-01-11 05:31:26

标签: spring web-services rest http spring-boot

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

为了运行运行状况检查,我还需要公开RESTful API。我尝试使用Actuator和休息控制器:

@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, "/*");
    }
}

1 个答案:

答案 0 :(得分:4)

因此,在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执行程序生成健康检查,为您的应用程序指标。您也可以覆盖它以进行自定义。

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