我们有一个基于 Spring WS 和 DefaultWsdl11Definition 的(工作)SOAP Web 服务。
这基本上是它的样子:
@Endpoint("name")
public class OurEndpoint {
@PayloadRoot(namespace = "somenamespace", localPart = "localpart")
public void onMessage(@RequestPayload SomePojo pojo) {
// do stuff
}
}
它在 Spring 中连接,并且正确处理我们所有的 SOAP 请求。唯一的问题是该方法返回 202 接受 .这不是调用者想要的,他宁愿让我们返回 204 无内容 (或者如果这不可能是空的 200 OK )。
我们的其他端点有一个有效的响应对象,并返回 200 确定 .似乎无效的原因 202 当 204 可能更合适?
是否可以更改 Spring WS 中的响应代码?我们似乎找不到正确的方法来做到这一点。
我们尝试过但没有成功的事情:
有任何想法吗?
最佳答案
与我在评论中所写的不同,创建委托(delegate)类型的解决方案可能是最简单的。
public class DelegatingMessageDispatcher extends MessageDispatcher {
private final WebServiceMessageReceiver delegate;
public DelegatingMessageDispatcher(WebServiceMessageReceiver delegate) {
this.delegate = delegate;
}
public void receive(MessageContext messageContext) throws Exception {
this.delegate.receive(messageContext);
if (!messageContext.hasResponse()) {
TransportContext tc = TransportContextHolder.getTransportContext();
if (tc != null && tc.getConnection() instanceof HttpServletConnection) {
((HttpServletConnection) tc.getConnection()).getHttpServletResponse().setStatus(200);
}
}
}
}
然后你需要配置一个名为
messageDispatcher
的bean这将包装默认 SoapMessageDispatcher
.@Bean
public MessageDispatcher messageDispatcher() {
return new DelegatingMessageDispatcher(soapMessageDispatcher());
}
@Bean
public MessageDispatcher soapMessageDispatcher() {
return new SoapMessageDispatcher();
}
像这样的东西应该可以解决问题。现在,当创建响应时(在返回类型为 void 的情况下),您想要的状态将发送回客户端。
关于Spring WS (DefaultWsdl11Definition) 带有 void 的 HTTP 状态码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34906204/