Spring 启动 WS-Server - 自定义 Http 状态

Spring Boot WS-Server - Custom Http Status

我使用 Spring Boot WS-Server

发布了端点

当我使用 SoapUI 时,我看到:

HTTP/1.1 200 接受:text/xml、text/html、image/gif、image/jpeg、*; q=.2, /; q=.2 肥皂动作:“” 内容类型:text/xml;charset=utf-8 内容长度:828 日期:2021 年 4 月 29 日,星期四 14:04:54 GMT 保持活动:超时=60 连接:保持活动

我想设置自定义 HTTP 状态作为响应(我知道这可能不符合标准,但这是外部要求)。我还阅读了以下主题:

但是这个解决方案失败了

Spring启动版本:2.2.7

问题已解决

正如我所说,我想在 SOAP 响应中设置自定义 HTTP 状态。

我找到了这个 post:

作者使用 EndpointInterceptor 和 TransportContext 来获取 HttpServletResponse,然后他改变了状态。我和他的情况的区别在于,他 return 从 WebService 方法中删除了 void 而我想要 return 一些响应。

在我的情况下,Spring WebServiceMessageReceiverObjectSupport class 中的代码(方法 handleConnection)覆盖了先前在拦截器中设置的 servlet 状态:

if (response instanceof FaultAwareWebServiceMessage && connection instanceof FaultAwareWebServiceConnection) {
                    FaultAwareWebServiceMessage faultResponse = (FaultAwareWebServiceMessage)response;
                    FaultAwareWebServiceConnection faultConnection = (FaultAwareWebServiceConnection)connection;
                    faultConnection.setFaultCode(faultResponse.getFaultCode());
                }

为了绕过这段代码,我需要用我自己的 handleConnection 方法实现来定义 class,它扩展了 class WebServiceMessageReceiverHandlerAdapter

在我的实施中,我排除了状态变化。重要的是在这个 class 的自动装配构造函数中传递 WebMessageFactory bean,否则在应用程序启动期间会引发异常。

这个 class 必须用 Spring 构造型标记(例如 @Component),并且在配置 ServletRegistrationBean 时必须在 Configuration class 中配置这个 bean 的名称:

@Bean
    public ServletRegistrationBean<MessageDispatcherServlet> messageDispatcherServlet(ApplicationContext applicationContext){
        MessageDispatcherServlet servlet = new MessageDispatcherServlet();
        servlet.setApplicationContext(applicationContext);
        servlet.setTransformWsdlLocations(true);
        servlet.setMessageFactoryBeanName("webServiceMessageFactory");
        servlet.setMessageReceiverHandlerAdapterBeanName("myOwnMessageReceiverHandlerAdapter");
        return new ServletRegistrationBean<>(servlet,"/ws/*");
    }