SpringWS端点向soap主体添加多个子元素
我正在使用SpringWS创建一个soap Web服务。我需要向soap主体添加多个子元素。目前,我只使用了一个额外的包装器元素 我应该返回的响应示例:SpringWS端点向soap主体添加多个子元素,soap,jaxb,spring-ws,Soap,Jaxb,Spring Ws,我正在使用SpringWS创建一个soap Web服务。我需要向soap主体添加多个子元素。目前,我只使用了一个额外的包装器元素 我应该返回的响应示例: <?xml version="1.0" encoding="UTF-8"?> <soap:Envelope> <soap:Body> <Response> <ResponseResult href="#id1"/> </Response>
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope>
<soap:Body>
<Response>
<ResponseResult href="#id1"/>
</Response>
<Result id="id1">
...
</Result>
</soap:Body>
</soap:Envelope>
但我只能让它工作:
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope>
<soap:Body>
<Wrapper>
<Response>
<ResponseResult href="#id1"/>
</Response>
<Result id="id1">
...
</Result>
</Wrapper>
</soap:Body>
</soap:Envelope>
有人知道怎么解决这个问题吗?你需要更多的信息吗?我终于解决了。我基本上和这篇文章一样:但我会提供更多的信息 我扩展了EndpointInterceptorAdapter,并更改了方法HandlerResponseMessageContext messageContext,Object endpoint
看起来不错,虽然它似乎不处理SOAPFault,但在主体内部设置SOAPFault上的元素。仍在研究如何正确地做到这一点。
import org.springframework.stereotype.Component;
import org.springframework.ws.context.MessageContext;
import org.springframework.ws.server.endpoint.interceptor.EndpointInterceptorAdapter;
import org.springframework.ws.soap.saaj.SaajSoapMessage;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPMessage;
import java.util.LinkedList;
import java.util.List;
@Component
public class CustomEndpointInterceptorAdapter extends EndpointInterceptorAdapter {
/**
* Removes wrapper element.
*/
@Override
public boolean handleResponse(MessageContext messageContext, Object endpoint) throws Exception {
System.out.println("--------------------- Interceptor ---------------------");
SOAPMessage soapMsg = ((SaajSoapMessage)messageContext.getResponse()).getSaajMessage();
SOAPBody soapBody = soapMsg.getSOAPBody();
// Get all child nodes of wrapper
Node wrapper = soapBody.getFirstChild();
List<Node> children = getChildren(wrapper);
soapBody.removeContents();
// Add children to SOAPBody
children.forEach(node -> addNode(soapBody, node));
soapMsg.saveChanges();
return true;
}
private List<Node> getChildren(Node wrapper) {
List<Node> result = new LinkedList<>();
NodeList children = wrapper.getChildNodes();
for(int i = 0; i < children.getLength(); i++) {
result.add(children.item(i));
}
return result;
}
private void addNode(SOAPBody soapBody, Node node) {
try {
soapBody.addChildElement((SOAPElement)node);
} catch (SOAPException e) {
System.out.println("Doesn't work for Node: " + node.getNodeName());
e.printStackTrace();
}
}
}