SpringWS端点向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>

我正在使用SpringWS创建一个soap Web服务。我需要向soap主体添加多个子元素。目前,我只使用了一个额外的包装器元素

我应该返回的响应示例:

<?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();
        }
    }
}