Spring WS (DefaultWsdl11Definition) 带有 void 的 HTTP 状态码

Terrylee 阅读:105 2025-06-02 22:19:02 评论:0

我们有一个基于 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 中的响应代码?我们似乎找不到正确的方法来做到这一点。

我们尝试过但没有成功的事情:
  • 将返回类型更改为:
  • HttpStatus.NO_CONTENT
  • org.w3c.dom.Element <- 不接受
  • 添加@ResponseStatus <- 这是针对 MVC,而不是 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
    声明

    1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

    关注我们

    一个IT知识分享的公众号