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/*");
}
我使用 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/*");
}