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