Spring Boot WS-Server-自定义Http状态

Spring Boot WS-Server-自定义Http状态,spring,spring-boot,http,soap,wsdl,Spring,Spring Boot,Http,Soap,Wsdl,我使用SpringBootWS-Server发布了端点 当我使用SoapUI时,我看到: HTTP/1.1200 接受:text/xml、text/html、image/gif、image/jpeg、*;q=.2,/;q=.2 SOAPAction:“ 内容类型:text/xml;字符集=utf-8 内容长度:828 日期:2021年4月29日星期四14:04:54 GMT 保持活动状态:超时=60 连接:保持活力 我想在响应中设置自定义HTTP状态(我知道这可能违反标准,但这是一个外部要求)。

我使用SpringBootWS-Server发布了端点

当我使用SoapUI时,我看到:

HTTP/1.1200 接受:text/xml、text/html、image/gif、image/jpeg、*;q=.2,/;q=.2 SOAPAction:“ 内容类型:text/xml;字符集=utf-8 内容长度:828 日期:2021年4月29日星期四14:04:54 GMT 保持活动状态:超时=60 连接:保持活力

我想在响应中设置自定义HTTP状态(我知道这可能违反标准,但这是一个外部要求)。我还读了以下主题:

但这一解决方案失败了

Spring启动版本:2.2.7

问题已解决

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

我发现这个帖子:

作者使用EndpointInterceptor和TransportContext来获取HttpServletResponse,然后更改了状态。我和他的案例之间的区别在于,他从WebService方法返回void,而我想返回一些响应

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

if (response instanceof FaultAwareWebServiceMessage && connection instanceof FaultAwareWebServiceConnection) {
                    FaultAwareWebServiceMessage faultResponse = (FaultAwareWebServiceMessage)response;
                    FaultAwareWebServiceConnection faultConnection = (FaultAwareWebServiceConnection)connection;
                    faultConnection.setFaultCode(faultResponse.getFaultCode());
                }
为了绕过这段代码,我需要用自己的handleConnection方法实现来定义类,该方法扩展了类WebServiceMessageReceiveHandlerAdapter

在我的实现中,我排除了状态更改。重要的是在此类的自动连接构造函数中传递WebMessageFactory bean,否则在应用程序启动期间会引发异常

该类必须用Spring原型(例如@Component)标记,并且在配置ServletRegistrationBean时,必须在配置类中配置该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/*");
    }
@Bean
public ServletRegistrationBean messageDispatcherServlet(ApplicationContext ApplicationContext){
MessageDispatcherServlet servlet=new MessageDispatcherServlet();
setApplicationContext(applicationContext);
setTransformWsdlLocations(true);
setMessageFactoryBeanName(“webServiceMessageFactory”);
setMessageReceiverHandlerAdapterBeanName(“myowMessageReceiverHandlerAdapter”);
返回新的ServletRegistrationBean(servlet,“/ws/*”);
}

您需要发布一些代码,告诉我们另一个问题的解决方案是如何失败的,或者很难帮助您。