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

标签 spring web-services soap spring-ws http-status-codes

我们有一个基于 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 WS (DefaultWsdl11Definition) 带有 void 的 HTTP 状态码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34906204/

    相关文章:

    java - 在 Spring MVC 中无法从单独的服务包中找到 bean

    c# - 由于特殊字符而难以读取 SOAP 响应

    php - 如何使用 PHP 从 Web 服务获取 XML 数据?

    python - 使用 Python 通过 SOAP 安排 JasperServer 报告

    spring - 如何覆盖Spring Cloud Ribbon中的ribbon.serverListRefreshInterval默认值?

    java - Spring REST API 播放实时音频

    php - 为什么 chrooted PHP (FPM) 在 chrooted shell 没有问题时会出现 DNS 问题?

    wcf - 在不更改站点绑定(bind)的情况下更改 WCF Web 服务的公开端点 URL

    .NET 远程处理与 SOA

    java - 升级 spring-boot-actuator 1.2.5.RELEASE 时无法打开 ServletContext 资源 [/<NONE>]