gpt4 book ai didi

web-services - 如何使用 CXF 拦截器和 org.w3c.dom.Node 修改 Web 服务请求

转载 作者:行者123 更新时间:2023-12-04 04:40:20 25 4
gpt4 key购买 nike

使用 CXF 拦截器我想将一些节点附加到发送到服务器的 xml 中。我创建了一个拦截器(见下文),它将消息作为 DOM 节点接收,修改它并将其写回消息对象。

不幸的是,代码没有按预期工作 - 发送到服务器的 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);
}
}

最佳答案

终于我找到了自己如何做到这一点。

  • 拦截器必须使用“Phase.PRE_PROTOCOL”
  • 拦截器必须使用 addAfter(SaajOutInterceptor) - SaajOutInterceptor 在消息中提供节点
  • 拦截器类应该派生自 AbstractSoapInterceptor
  • 拦截器的 handleMessage 不会做修改 DOM 本身的脏活,而是使用 message.getInterceptorChain().add(...) 向消息添加一个新的拦截器。
  • 然后新添加的拦截器应该修改 DOM
  • 关于web-services - 如何使用 CXF 拦截器和 org.w3c.dom.Node 修改 Web 服务请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7494314/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com