在SOAPHandler中从SOAP请求替换body元素时出错

时间:2017-09-20 11:22:02

标签: java jax-ws soaphandler

我使用速度模板来创建soap请求。 我使用jax-ws框架来实现Web服务客户端。 我已经连接了一个SOAP Handler来拦截出站消息。

我正在尝试用计算出的新体替换身体内容。

我在处理程序中使用以下代码:

public boolean handleMessage(SOAPMessageContext context) {

    boolean outbound = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
    try {
        if (outbound) {
            SOAPMessage msg = context.getMessage();
            SOAPPart sp = msg.getSOAPPart();
            SOAPEnvelope env = sp.getEnvelope();
            SOAPBody body = env.getBody();
            body.normalize();
            System.out.println(body.getValue());
            NodeList list = body.getElementsByTagName("template");
            if(list.getLength() > 0) {
                Element template = (Element) list.item(0);
                if (template != null) {
                    String newBody = StringEscapeUtils.unescapeHtml(template.getTextContent());
                    Document bodyElement = XmlUtils.getDocumentFromText(newBody);
                    body.removeContents();
                    body.addDocument(bodyElement);

当我执行它时,我收到以下错误:

  

org.w3c.dom.DOMException:NAMESPACE_ERR:尝试以对名称空间不正确的方式创建或更改对象。

如何在没有太多麻烦的情况下更改xml文本中的正文内容?

1 个答案:

答案 0 :(得分:0)

好的,我更多地挖掘,结果发现我找到了解决方案。这是代码:

SOAPMessage msg = context.getMessage();
            SOAPPart sp = msg.getSOAPPart();
            SOAPEnvelope env = sp.getEnvelope();
            SOAPBody body = env.getBody();
            body.normalize();
            System.out.println(body.getValue());
            NodeList list = body.getElementsByTagName("template");
            if(list.getLength() > 0) {
                Element template = (Element) list.item(0);
                if (template != null) {
                    String newBody = StringEscapeUtils.unescapeHtml(template.getTextContent());
                    Document bodyElement = XmlUtils.getBody(newBody);
                    body.removeContents();
                    body.addDocument(bodyElement);

更重要的是,方法XmlUtils.getBody:

public static Document getBody(String fromText) {
    Document result = null;

    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    factory.setNamespaceAware(true);
    try {
        DocumentBuilder builder = factory.newDocumentBuilder();
        result = builder.parse(new ByteArrayInputStream(fromText.getBytes()));
        NodeList list = result.getElementsByTagNameNS("soapenv", "Body");
        if(list.getLength() > 0) {
            Node body = list.item(0);
            result = builder.newDocument();
            result.adoptNode(body);
        }
    } catch(Exception e) {
        e.printStackTrace();
    }
    return result;
}

我实际上是我之前代码中的factory.setNamespaceAware(true)部分,解释了当时提出的异常。

问题解决了!