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

如何将wsa引用参数添加到cxf客户端调用?

庞阳波
2023-03-14

我了解如何简单地将“标准”ws-addressing头添加到cxf客户端调用:

JaxWsProxyFactoryBean factory = ...;
factory.getFeatures().add(new WSAddressingFeature());

但是我不明白如何添加wsa引用参数,以便消息的肥皂剧头如下所示:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:wsa="http://www.w3.org
/2005/08 /addressing" xmlns:ns1=... >
<soap:Header>
  <wsa:To>...</wsa:To>
  <wsa:Action>...</wsa:Action>
  <wsa:MessageID>...</wsa:MessageID>
  <ns1:Country wsa:IsReferenceParameter="true">xx</ns1:Country>
  <ns1:Brand wsa:IsReferenceParameter="true">x</ns1:Brand>
</soap:Header> ...

如何在cxf客户端调用中添加此标头?

你好,soilworker

共有1个答案

凤高澹
2023-03-14

这可以在AddressingProperties的帮助下完成。

factory.setServiceClass(...);
factory.setAddress(...);
factory.getFeatures().add(new WSAddressingFeature());
SomePortType client = (SomePortType) factory.create();
AddressingProperties maps = new AddressingPropertiesImpl();
EndpointReferenceType epr = new EndpointReferenceType();

//Then you can add referenceParameters to the epr
ReferenceParametersType ref = new ReferenceParametersType();
List<Object> paras = ref.getAny();
Country ctry = new Country("xx");

JAXBContext ctx = JAXBContext.newInstance(new Class[] {Country.class });
Marshaller marshaller = ctx.createMarshaller();
DOMResult res = new DOMResult();
marshaller.marshal(ctry, res);
Element elt = ((Document) res.getNode()).getDocumentElement();
any.add(elt);

epr.setReferenceParameters(ref);
maps.setTo(epr);

((BindingProvider)client).getRequestContext()
    .put(JAXWSAConstants.CLIENT_ADDRESSING_PROPERTIES, maps);

参考:cxf doc about ws addr(我无法发布更多链接,叹气……)和http://cxf.547215.n5.nabble.com/setting-reference-parameters-in-WS-Addressing-header-td3257262.html
我不熟悉JAXB,我认为它们可能是向ref添加参数的更好方法。

 类似资料:
  • 我们正在Spring Boot中构建CXF客户端。用于针对SOAP服务器进行身份验证/授权的SAML令牌在每个请求中都从外部身份验证代理以自定义HTTP头提供给我们的应用程序。因此,我需要一种方法将提供的令牌添加到每个传出的CXF请求中。 我知道我可以为此注册一个定制的CXF拦截器。然而, 我该如何在Spring Boot中注册拦截器? 如果没有拦截器,还有什么选择? 目前,Spring配置如下所

  • 我有一个wsdl,它定义了一个在调用Web服务时需要传递的肥皂头。 示例SOAP头是: CXF的wsdl2java生成了一个“身份验证信息”java类,我可以创建这个类并用用户名和密码填充它,但是我不知道在调用网络服务时如何将它传递给CXF客户端。

  • 问题内容: 我有一个wsdl,它定义了在调用Web服务时需要传递的soap标头。 样本SOAP标头是: CXF的wsdl2java生成了一个“ AuthenticationInfo” java类,我可以使用用户名和密码来创建和填充该类,但是我不知道在调用Web服务时将其传递给CXF客户端的正确方法。 问题答案: 那么,最简单的方式做这将是创建的对象,并添加所有的参数或并添加所有的标头, 最后获取您

  • 我试图使用Keycloak rest API向特定用户添加客户端级别的角色。我在邮递员尝试这个,但不断得到404找不到。 https://{keycloak url}/auth/admin/realms/acme/users/b62dc517-0dd8-41ad-9d97-f385e507e279/role-mappings/clients/6b1f23b4-6bec-4873-a991-4b7e

  • 我正在使用Camel,并使用CXF从WSDL生成代码。我生成了一个客户端存根,实现如下所示: 如您所见,端口接受两个参数并返回响应,我想将其委托回我的骆驼路由。在 Camel 中实现这一点的最佳方法是什么?我已经定义了我的 CXF Enpoint,我只是在努力解决其中的 DSL 路由部分。我应该添加像此链接中那样的处理器吗?Apache Camel和Web服务 谢谢

  • 在这两个webendpoint上-但是错误仍然存在。如果WS-Addressing没有设置为true,那么SOAPUI也会失败。