我知道这已被问过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
答案 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());
}
.
.
.
}