简体   繁体   English

如何在 Axis2 客户端中正确使用 WS-Addressing?

[英]How do I use WS-Addressing properly in an Axis2 client?

All, I'm attempting to write a Junit test that calls a Web Service client in Axis2.1.5, and I've gotten confused about how to exactly to set it up to use WS-Addressing.所有,我正在尝试编写一个 Junit 测试来调用 Axis2.1.5 中的 Web 服务客户端,但我对如何准确设置它以使用 WS-Addressing 感到困惑。

I've generated a client stub using wsdl2java, and I'm using the axis2.xml and modules repository from the axis2 binary distribution.我已经使用 wsdl2java 生成了一个客户端存根,并且我正在使用axis2 二进制分发版中的axis2.xml 和模块存储库。

I know I need to use the MemberSubmission version of the WS-Addressing, and I think I've got that set up correctly (using Options), but the headers don't seem to get generated correctly.我知道我需要使用 WS-Addressing 的 MemberSubmission 版本,并且我认为我已经正确设置了(使用选项),但是标题似乎没有正确生成。 (I say 'seem' because I can't figure out how to the SOAPMonitor module working either - I'd welcome any tips on that too!). (我说“似乎”是因为我也无法弄清楚 SOAPMonitor 模块如何工作 - 我也欢迎任何有关此的提示!)。

My main confusion, though, is around what exactly it takes to 'engage' the Addressing module.不过,我的主要困惑在于“使用”寻址模块究竟需要什么。 Should it be enough to set up my ConfigurationContext with an axis2.xml file that has a reference to the addressing module?使用具有寻址模块引用的axis2.xml 文件来设置我的ConfigurationContext 是否就足够了? Like this?像这样? :

//standard out of the box axis2 configs
 ConfigurationContext myConfigContext = ConfigurationContextFactory
   .createConfigurationContextFromFileSystem("C:/devapps/axis2-1.5.1/repository","C:/devapps/axis2-1.5.1/conf/axis2.xml");

  Options options = new Options();
  EndpointReference targetEPR = new EndpointReference(
    "https://host:port/service.asmx");

  options.setTo(targetEPR);

                //I believe this is what I'm supposed to do to specify the 
  //MemberSubmission version of WS-Addressing
  options.setProperty(AddressingConstants.WS_ADDRESSING_VERSION,
    AddressingConstants.Submission.WSA_NAMESPACE);
  //No idea of this is needed or not.
  options.setProperty(AddressingConstants.INCLUDE_OPTIONAL_HEADERS,
    Boolean.TRUE);
  options.activate(myConfigContext);
  options.setAction("someAction");

  CaseDetailsServiceStub stub = new CaseDetailsServiceStub(
    "https://host:port/service.asmx");
  stub._getServiceClient().setOptions(options);

  //I'm calling this from a Junit test
  assertNotNull(stub.someAction(someParam));

With my options set up like above, is see in the log file that the modules are getting loaded from axis2.xml:我的选项设置如上,在日志文件中可以看到模块是从axis2.xml加载的:

[INFO] Deploying module: addressing-1.5.1 - file:/C:/devapps/axis2-1.5.1/repository/modules/addressing-1.5.1.mar

But I don't think I'm getting any addressing headers.但我认为我没有收到任何地址标头。 The error I get back from the server at this point says:此时我从服务器返回的错误说:

Header http://schemas.xmlsoap.org/ws/2004/08/addressing:Action for ultimate recipient is required but not present in the message.标头http://schemas.xmlsoap.org/ws/2004/08/addressing:最终收件人的操作是必需的,但不会出现在消息中。

So, I've also seen some documents reference 'engaging' modules.因此,我还看到一些文档引用了“引人入胜”的模块。 When I try to add this line to my code and add the addressing-1.5.1.mar to my classpath, though:但是,当我尝试将此行添加到我的代码并将addressing-1.5.1.mar 添加到我的类路径时:

stub._getServiceClient().engageModule("addressing");

I get an error that says:我收到一条错误消息:

Unable to engage module : addressing org.apache.axis2.AxisFault: Unable to engage module : soapmonitor at org.apache.axis2.client.ServiceClient.engageModule(ServiceClient.java:358)无法参与模块:解决 org.apache.axis2.AxisFault:无法参与模块:在 org.apache.axis2.client.ServiceClient.engageModule(ServiceClient.java:358) 的soapmonitor

No other info or stack trace in the logs beyond, that, though, so I'm confused.但是,日志中没有其他信息或堆栈跟踪,所以我很困惑。

Any ideas on what I'm doing wrong?关于我做错了什么的任何想法?

put addressign.mar and sopamoniter.mar into lib or classpath of project .将 addressign.mar 和 sopamoniter.mar 放入项目的 lib 或 classpath 中。 it works for me find the mar from axis2 kit它对我有用,可以从axis2套件中找到mar

In my Maven project, I had to declare an additional dependency on the org.apache.axis2:addressing artifact:在我的 Maven 项目中,我必须声明对org.apache.axis2:addressing工件的额外依赖:

<dependency>
    <groupId>org.apache.axis2</groupId>
    <artifactId>addressing</artifactId>
    <version>1.6.2</version>
    <classifier>classpath-module</classifier>
</dependency>
MyServiceStub stub = new MyServiceStub(targetEndpoint);
stub._getServiceClient().engageModule("addressing");

I don't see any classpath-module artifacts for SoapMonitor on Maven Central , though.不过,我在 Maven Central 上没有看到SoapMonitor 的任何classpath-module工件。

Address can be added directly to Soap Header.地址可以直接添加到 Soap Header 中。

SOAPHeader soapHeader = soapEnvelope.getHeader();
soapHeader.declareNamespace("http://www.w3.org/2005/08/addressing", "wsa");

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM