Spring-Ws从响应中删除命名空间前缀(ns2,ns3 ......)

时间:2017-03-15 11:15:32

标签: java spring web-services soap spring-ws

我知道这已被问过100次。但我无法做到这一点。响应总是如下:

<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)也没有帮助......

提前致谢。

聚苯乙烯。我很想使用纯粹的Spring-WS解决方案,而不是使用任何类型的marshallers等来自jaxb

1 个答案:

答案 0 :(得分:0)

我自己设法解决了这个问题。虽然我没有得到社区的答复,但我想在这里写下答案,所以没有人必须为今天的事情而奋斗。

我不确定是否有办法直接使用神奇的Spring @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());
        }
.
.
.
}