【问题标题】:jax-ws client problemjax-ws 客户端问题
【发布时间】:2011-08-29 09:14:10
【问题描述】:

我已经通过执行命令生成了一个 jax-ws 客户端:

C:\wsdl>wsimport -keep -verbose -d 生成 HealthMobilitySequenceArtifacts.wsdl

wsdl文件中的服务地址为:

肥皂:地址位置=“http://localhost:8585/active-bpel/services/HealthMobilitySequence

好吧,我已经将生成的文件打包在一个 jar (clentjaxw.jar) 中,并且我在 eclipse 项目中使用它作为导入库来进行一些测试。

事实上,我能够毫无问题地进行测试,但是当我提供同事 clientjaxw.jar 时,他在执行过程中出现以下错误:

线程“主”com.sun.xml.internal.ws.client.ClientTransportException 中的异常:HTTP 传输错误:java.net.ConnectException:连接被拒绝:连接 在 com.sun.xml.internal.ws.transport.http.client.HttpClientTransport.getOutput(未知来源) 在 com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.process(未知来源) 在 com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.processRequest(未知来源) 在 com.sun.xml.internal.ws.transport.DeferredTransportPipe.processRequest(未知来源) 在 com.sun.xml.internal.ws.api.pipe.Fiber.__doRun(未知来源) 在 com.sun.xml.internal.ws.api.pipe.Fiber._doRun(未知来源) 在 com.sun.xml.internal.ws.api.pipe.Fiber.doRun(未知来源) 在 com.sun.xml.internal.ws.api.pipe.Fiber.runSync(未知来源) 在 com.sun.xml.internal.ws.client.Stub.process(未知来源) 在 com.sun.xml.internal.ws.client.sei.SEIStub.doProcess(未知来源) 在 com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(未知来源) 在 com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(未知来源) 在 com.sun.xml.internal.ws.client.sei.SEIStub.invoke(未知来源) 在 $Proxy29.bookTreatment(未知来源) 在 test.TestJaxWS.main(TestJaxWS.java:32) 引起:java.net.ConnectException:连接被拒绝:连接 在 java.net.PlainSocketImpl.socketConnect(本机方法) 在 java.net.PlainSocketImpl.doConnect(未知来源) 在 java.net.PlainSocketImpl.connectToAddress(未知来源) 在 java.net.PlainSocketImpl.connect(未知来源) 在 java.net.SocksSocketImpl.connect(未知来源) 在 java.net.Socket.connect(未知来源) 在 java.net.Socket.connect(未知来源) 在 sun.net.NetworkClient.doConnect(未知来源) 在 sun.net.www.http.HttpClient.openServer(未知来源) 在 sun.net.www.http.HttpClient.openServer(未知来源) 在 sun.net.www.http.HttpClient.(Unknown Source) 在 sun.net.www.http.HttpClient.New(未知来源) 在 sun.net.www.http.HttpClient.New(未知来源) 在 sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(未知来源) 在 sun.net.www.protocol.http.HttpURLConnection.plainConnect(未知来源) 在 sun.net.www.protocol.http.HttpURLConnection.connect(未知来源) 在 sun.net.www.protocol.http.HttpURLConnection.getOutputStream(未知来源) ... 15 更多

我不明白这个问题:尽管如此,同事还是能够在浏览器中看到该地址处的服务,并且 ping localhost 也可以运行。此外,我已经检查过他没有代理。

您对问题的原因有什么想法吗?


更新: 我必须添加新的详细信息:我发现该同事能够通过浏览器访问:http://localhost:8585/active-bpel/services/HealthMobilitySequence?wsdl,但如果他尝试访问:http://127.0.0.1:8585/active-bpel/services/ HealthMobilitySequence?wsdl 或使用 ip 地址代替 localhost 的相同 url 他失败了。在我的机器上我没有这样的问题,我可以通过所有可能性访问:localhost、机器名称、127.0.0.1、ipaddress。

所以我认为这可能是问题我的意思是我想象通过 java,在打开 java 套接字连接之前,url http://localhost:8585/active-bpel/services/HealthMobilitySequence 被翻译,在一个使用 ip 地址(或 127.0.0.1)的新连接中本地主机和访问失败。因此,问题似乎出在操作系统上,因为我们在操作系统的一部分上共享完全相同的配置(我的机器上是 win xp,他的机器上是 vista)。

一些想法?谢谢


更新:再次嗨,由于某种原因更换机器(总是 64 位),同事已经解决了我描述的问题。无论如何,他还有另一个不依赖于客户端的问题,因为他也通过使用 Eclipse Web Explorer 调用遇到了同样的问题。 例外情况如下: java.lang.ClassCastException: com.sun.xml.internal.messaging.saaj.soap.ver1_1.Envelope1_1Impl 无法转换为 java.lang.String

    org.apache.axis.SOAPPart.getAsString(SOAPPart.java:554)

    org.apache.axis.SOAPPart.writeTo(SOAPPart.java:322)

    org.apache.axis.SOAPPart.writeTo(SOAPPart.java:269)

    org.apache.axis.Message.writeTo(Message.java:539)

    org.apache.axis.transport.http.AxisServlet.sendResponse(AxisServlet.java:902)

    org.apache.axis.transport.http.AxisServlet.doPost(AxisServlet.java:777)

    javax.servlet.http.HttpServlet.service(HttpServlet.java:647)

    org.apache.axis.transport.http.AxisServletBase.service(AxisServletBase.java:327)

    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)

请注意他要调用的 Web 服务是部署在 ActiveBPEL(版本 5.0.2)中的 bpel 流程之一,该 ActiveBPEL(版本 5.0.2)在 Tomcat 5.5.27 中运行。此外,它的配置如下:OP:windows 7,jdk:1.6,arch:64位,而我的是:OP:windows xp,jdk:1.6,arch:32位。 你对这个问题有什么想法吗?

提前致谢

【问题讨论】:

  • 这听起来像是配置问题。我会检查您的同事是否安装了 IPv4(有关详细信息,请参阅 this post)。

标签: java jax-ws


【解决方案1】:

我在构建和测试 ActiveBPEL 代码时遇到了这个问题。我的解决方案是将 java.xml.soap.MessageFactory 显式映射到 Axis 实现。这避免了两个 SOAP 堆栈之间的不兼容。

映射可以通过几种不同的方式完成。

  1. 使用系统属性 -Djavax.xml.soap.MessageFactory=org.apache.axis.soap.MessageFactoryImpl
  2. 在类路径中包含工厂文件:/META-INF/javax.xml.soap.MessageFactory,其中该文件的内容是单行文本:org.apache.axis.soap.MessageFactoryImpl

如果您正在构建 AE 源代码,那么后者是首选机制,可以添加到 org.activebpel.rt.axis.bpel 项目中。如果您使用的是二进制文件,那么您可能需要在您的容器(Tomcat/Jetty)的启动脚本上创建一个自定义属性。

【讨论】: