【问题标题】:Spring WS endpoint add multiple child elements to soap bodySpring WS端点将多个子元素添加到soap body
【发布时间】:2018-03-19 09:34:14
【问题描述】:

我正在使用 Spring WS 创建一个肥皂网络服务。我需要向我的肥皂主体添加多个子元素。目前我只能使用一个额外的包装元素来实现它。

我应该返回的响应示例:

<?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>

有人知道如何解决这个问题吗?您需要更多信息吗?

【问题讨论】:

    标签: soap jaxb spring-ws


    【解决方案1】:

    我终于解决了。我基本上和这篇文章中的一样:https://stackoverflow.com/a/15741795/6931969,但我会提供更多信息。

    我扩展了 EndpointInterceptorAdapter 并更改了方法handleResponse(MessageContext messageContext, Object endpoint)

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

    【讨论】:

    • 看起来不错,虽然它似乎没有处理 SOAPFault,然后在主体内部的 SOAPFault 上设置元素。仍在研究如何正确地做到这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-29
    • 1970-01-01
    • 2014-10-07
    • 1970-01-01
    • 2011-05-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多