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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/2526012/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-29 21:36:26  来源:igfitidea点击:

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

javaaxis2ws-addressing

提问by elduff

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 thinkI've got that set up correctly (using Options), but the headers don't seem to get generated correctly. (I say 'seem' because I can't figure out how to the SOAPMonitor module working either - I'd welcome any tips on that too!).

我知道我需要使用 WS-Addressing 的 MemberSubmission 版本,并且我认为我已经正确设置了(使用选项),但是标题似乎没有正确生成。(我说“似乎”是因为我也无法弄清楚 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? Like this? :

不过,我的主要困惑在于“使用”寻址模块究竟需要什么。使用具有寻址模块引用的axis2.xml 文件来设置我的ConfigurationContext 是否就足够了?像这样?:

//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:Actionfor 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?

关于我做错了什么的任何想法?

采纳答案by deepak

put addressign.mar and sopamoniter.mar into lib or classpath of project . it works for me find the mar from axis2 kit

将 addressign.mar 和 sopamoniter.mar 放入项目的 lib 或 classpath 中。它对我有用,可以从axis2 套件中找到mar

回答by Ben Hutchison

In my Maven project, I had to declare an additional dependency on the org.apache.axis2:addressingartifact:

在我的 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-moduleartifacts for SoapMonitor on Maven Central, though.

不过,我在 Maven Central 上没有看到SoapMonitor 的任何classpath-module工件。