如何使用带有org.w3c.dom.Node的CXF拦截器修改Web服务请求

问题描述 投票:4回答:2

使用CXF拦截器,我想在发送到服务器的xml上附加一些Node。我创建了一个拦截器(见下文),将消息作为DOM Node进行拾取,修改并将其写回到消息对象。

[不幸的是,该代码无法按预期工作-发送到服务器的XML不包含'magicWord'。恕我直言,我为此使用了错误的阶段。

所以问题是:如何使用org.w3c.dom.Node语法修改传出的Web服务请求?

package dummy;

import org.apache.cxf.message.Message;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

class DummyInterceptor extends AbstractPhaseInterceptor {

    String magicWord = "abc";

    public DummyInterceptor() {
        super(Phase.PRE_PROTOCOL);
    }

    public void handleMessage(Message message) {
        Document document = (Document) message.getContent(Node.class);
        NodeList nodes = document.getElementsByTagName("wsse:Security");
        if (nodes.getLength() == 1) {
            Node wsseSecurityNode = nodes.item(0);
            wsseSecurityNode.appendChild(document.createTextNode(magicWord));
        }
        message.setContent(Node.class, document);
    }
}
web-services dom cxf interceptor
2个回答
5
投票

最后,我发现了自己的操作方法。

  • 拦截器必须使用'Phase.PRE_PROTOCOL'
  • 拦截器必须使用addAfter(SaajOutInterceptor)-SaajOutInterceptor在消息中提供节点
  • 拦截器类应该派生自AbstractSoapInterceptor
  • 拦截器的handleMessage不会做修改DOM本身的工作,而是使用message.getInterceptorChain()。add(...)向消息添加一个新的拦截器。>
  • 然后应该新添加拦截器来修改DOM

0
投票

如果您要使用cxf拦截器中的DOM api修改请求的主体,则正确的阶段是USER_PROTOCOL

© www.soinside.com 2019 - 2024. All rights reserved.