Spring-WS从响应中删除名称空间前缀(NS2,NS3 ..)



我知道这已被问到100k次。但是我不设法这样做。响应总是如下:

<SOAP-ENV:Header/>
<SOAP-ENV:Body>
    <ns2:getReportResponse xmlns:ns2="http://www.example.net/myresource">
        <ns2:Report>JVBE...</ns2:Report>
        <ns2:Messages/>
    </ns2:getReportResponse>
</SOAP-ENV:Body>

我想得到:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header/>
<SOAP-ENV:Body>
    <getReportResponse xmlns="http://www.example.net/example">
        <Report>JVBE...</Report>
        <Messages/>
    </getReportResponse>
</SOAP-ENV:Body>

我已经尝试设置elementFormDefault="unqualified"而没有任何成功(完成后我得到了空的响应...)。有任何想法吗?@NameSpace(prefix="" namespace=NAMESPACE_URI)也没有帮助...

预先感谢。

ps。我很想使用纯Spring-WS解决方案,而不是使用Jaxb

的任何类型的编织者等等

我自己设法修复了它。即使我没有得到社区的答案,我想在这里写下答案,所以没有人必须在我今天的一切中挣扎。

我不确定是否有一种使用神奇的弹簧@notation直接实现此目的的方法。尽管如此,我设法自己做了以下操作:

我创建了一个EndpointInterceptor,我在其中实现了一个邮政处理器来删除不需要的前缀。

public class GlobalEndpointInterceptor implements EndpointInterceptor {
    @Override
    public boolean handleRequest(MessageContext messageContext, Object o) throws Exception {
        return true;
    }
    @Override
    public boolean handleResponse(MessageContext messageContext, Object o) throws Exception {
        return true;
    }
    @Override
    public boolean handleFault(MessageContext messageContext, Object o) throws Exception {
        return false;
    }
    @Override
    public void afterCompletion(MessageContext messageContext, Object o, Exception e) throws Exception {
        try {
            SOAPMessage soapMessage = ((SaajSoapMessage) messageContext.getResponse()).getSaajMessage();
            SOAPHeader header = soapMessage.getSOAPHeader();
            SOAPBody body = soapMessage.getSOAPBody();
            header.setPrefix("");
            body.setPrefix("");
            Iterator<SOAPBodyElement> it = body.getChildElements();
            while (it.hasNext()) {
                SOAPBodyElement node = it.next();
                node.setPrefix("");
                Iterator<SOAPBodyElement> it2 = node.getChildElements();
                while (it2.hasNext()) {
                    SOAPBodyElement node2 = it2.next();
                    node2.setPrefix("");
                    Iterator<SOAPBodyElement> it3 = node2.getChildElements();
                    while (it3.hasNext()) {
                        SOAPBodyElement node3 = it3.next();
                        node3.setPrefix("");
                    }
                }
            }
        } catch (SOAPException exx) {
            exx.printStackTrace();
        }
    }
}

,然后简单地将已实现的拦截器添加到WS配置中,如下所示:

    @Configuration
    @EnableWs
    public class ExampleConfiguration extends WsConfigurerAdapter {
        @Override
        public void addInterceptors(List<EndpointInterceptor> interceptors) {
            interceptors.add(new GlobalEndpointInterceptor());
        }
.
.
.
}

相关内容

  • 没有找到相关文章

最新更新