当前位置: 首页 > 知识库问答 >
问题:

Apache Camel CXF在更新元素列表时调用RPC/编码WSDL困难

乐正嘉瑞
2023-03-14

虽然没有官方支持,但通过对WSDL进行一些小的修改,我能够成功地为WSDL生成CXF对象,并让Camel CXF与RPC/编码的WSDLendpoint通信。代码非常简单,除了尝试发送元素列表的更新外,大多数请求/响应都可以正常工作。以下是该服务的期望:

<代码>

VS以下是发送的内容:

<代码>

我需要将arrayType添加到传出消息中。我研究了多种方法:

1)在CXF发送SOAP消息之前的拦截器,然后使用XPath添加元素,但我不清楚如何使用Apache Camel Camel CXF完成此操作。如何从Camel上下文中检索CXF客户端?

MyService客户端=

2) 通过WSDL修复它?是否可以将此元素添加到WSDL中,以便将其作为CXF对象的一部分生成?目前定义如下:

<代码>

“消息”和“部分”来自http://schemas.xmlsoap.org/wsdl/.

如有任何想法或建议,将不胜感激。谢谢

共有1个答案

夏意蕴
2023-03-14

万一有人碰到类似的问题,我自己就想出来了。我能够通过CamelContext检索CxfEndpoint:

camelContext.getEndpoint(endpointUrl, CxfEndpoint.class);

然后我可以添加我创建的拦截器:

public class MyCxfInterceptor extends AbstractPhaseInterceptor<SoapMessage> {
...

使用CxfEndpoint方法:

cxfEndpoint.getOutInterceptors().add(new MyCxfInterceptor());

在我的拦截器中,我还集成了另一个拦截器SAAJOutInterceptor,它将SOAP转换为易于使用的对象

private List<PhaseInterceptor<? extends Message>> extras = new ArrayList<>(1);

public MyCxfInterceptor() {
    super(Phase.USER_PROTOCOL);
    extras.add(new SAAJOutInterceptor());
}

public Collection<PhaseInterceptor<? extends Message>> getAdditionalInterceptors() {
    return extras;
}

易于使用的SOAP消息:

@Override
public void handleMessage(SoapMessage soapMessage) throws Fault {
    SOAPMessage msg = soapMessage.getContent(SOAPMessage.class);

    try {
        SOAPBody soapBody = msg.getSOAPBody();

然后,只需使用XPATH对传出的SOAP消息进行更正。

private XPath xpath = XPathFactory.newInstance().newXPath();
...
NodeList nodeList = soapBody.getElementsByTagName("tagName");
for (int x = 0; x < nodeList.getLength(); x++) {
    Node node = nodeList.item(x);
    ((Element) node).setAttribute("missingAttributeName", "missingAttributeValue");
}

我希望这能帮助任何使用具有挑战性的SOAP服务的人!

这要归功于博客,它在帮助我实现此解决方案方面发挥了重要作用:https://xceptionale.wordpress.com/2016/06/26/message-interceptor-to-modify-outbound-soap-request/

 类似资料:
  • 我有客户对象的列表。我想迭代列表并按1递增顺序。 我尝试了每个列表,但在这里我必须创建新列表并在其中添加值。 有没有更好的方法?我尝试使用streams,但它只是映射订单

  • 主要内容:1. WSDL元素,2. WSDL文档结构WSDL将Web服务分解为三个特定的,可识别的元素,这些元素可以在定义后组合或重用。 可以单独定义的WSDL的三个主要元素是 - 类型 操作 绑定 WSDL文档有各种元素,但它们包含在这三个主要元素中,可以作为单独的文档开发,可以将它们组合或重用以形成完整的WSDL文件。 1. WSDL元素 WSDL文档包含以下元素 - 定义 - 它是所有WSDL文档的根元素。 它定义Web服务的名称,声明在整个

  • 我有这个HTML列表 和一个通过AJAX添加新名称的表单,多个由逗号分隔的add。响应是一个包含姓名的列表 我尝试在列表中按字母顺序插入这些名称,如下面的示例https://jsfidle.net/vqu3s/7/

  • WSDL 元素定义Web服务支持的端口。 对于每个支持的协议,都有一个元素。 元素是端口的集合。 Web服务客户端可以从服务元素中学习以下内容 - 在哪里访问该服务? 通过哪个端口访问Web服务? 如何定义通信消息? 元素包含一个文档元素,用于提供人类可读的文档。 下面是示例章节中的一段代码 - 元素的绑定属性将服务的地址与Web服务中定义的绑定元素相关联。 在这个例子中,它绑定的是。

  • WSDL 元素通过为绑定指定单个地址来定义单个端点。 这是指定端口的语法 - 元素有两个属性:和。 属性在封闭的WSDL文档中定义的所有端口中提供唯一名称。 属性是指使用WSDL定义的链接规则进行绑定。 绑定可扩展性元素用于指定端口的地址信息。 端口不得指定多个地址。 端口不得指定除地址信息之外的任何绑定信息。 以下是示例章节中的一段代码 -

  • 主要内容:SOAP绑定WSDL 元素提供了有关如何通过线路传输实际操作的具体细节。 绑定可以通过多种传输方式提供,包括HTTP GET,HTTP POST或SOAP。 绑定提供了有关用于传输操作的协议的具体信息。 绑定提供服务所在的信息。 对于SOAP协议,绑定是使用,表示传输是基于HTTP协议的SOAP消息。 可以为单个指定多个绑定。 绑定元素有两个属性:和属性。 在上面示例代码中,属性定义绑定的名称,属性指向绑定的