【问题标题】:Webservice client for Java 6 not working in Java 8Java 6 的 Web 服务客户端在 Java 8 中不起作用
【发布时间】:2015-11-17 08:17:11
【问题描述】:

我正在使用 wsimport 为 WSO2 网络服务 (/services/RemoteUserStoreManagerService?wsdl) 生成客户端。

WSO2 在 JAVA 6 上的单独服务器上运行。

我的问题是使用 JAVA 8 生成客户端时,我无法调用 web 服务。

JAVA 6

使用 JAVA 6 时,存根生成和调用工作正常。我通过将客户端构造函数更改为接受 ULR 来动态指定 url。

JAVA 8

当使用 JAVA 8 生成客户端并且我使用默认构造函数(它在静态块中硬编码了 url)来调用 Web 服务客户端时,它工作正常,但是对于具有 void 返回类型的方法给出了下面提到的错误。

Exception in thread "main" javax.xml.ws.WebServiceException: No response returned.
at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:98)
at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:77)
at com.sun.xml.internal.ws.client.sei.SEIStub.invoke(SEIStub.java:147)
at com.sun.proxy.$Proxy34.updateRoleListOfUser(Unknown Source)
at com.abc.xyz.portal.service.UserAdminServiceClient.updateUser(UserAdminServiceClient.java:181)
at com.abc.xyz.portal.service.UserAdminServiceClient.main(UserAdminServiceClient.java:192)

但是当我尝试通过使用生成的方法构造函数(URL url)指定 WSDL LOCATION 来调用客户端时,我得到以下异常:

Exception in thread "main" java.lang.NullPointerException
at com.sun.xml.internal.ws.model.JavaMethodImpl.freeze(JavaMethodImpl.java:379)
at com.sun.xml.internal.ws.model.AbstractSEIModelImpl.freeze(AbstractSEIModelImpl.java:105)
at com.sun.xml.internal.ws.model.RuntimeModeler.buildRuntimeModel(RuntimeModeler.java:320)
at com.sun.xml.internal.ws.db.DatabindingImpl.<init>(DatabindingImpl.java:85)
at com.sun.xml.internal.ws.db.DatabindingProviderImpl.create(DatabindingProviderImpl.java:59)
at com.sun.xml.internal.ws.db.DatabindingProviderImpl.create(DatabindingProviderImpl.java:43)
at com.sun.xml.internal.ws.db.DatabindingFactoryImpl.createRuntime(DatabindingFactoryImpl.java:105)
at com.sun.xml.internal.ws.client.WSServiceDelegate.buildRuntimeModel(WSServiceDelegate.java:875)
at com.sun.xml.internal.ws.client.WSServiceDelegate.createSEIPortInfo(WSServiceDelegate.java:892)
at com.sun.xml.internal.ws.client.WSServiceDelegate.addSEI(WSServiceDelegate.java:855)
at com.sun.xml.internal.ws.client.WSServiceDelegate.getPort(WSServiceDelegate.java:435)
at com.sun.xml.internal.ws.client.WSServiceDelegate.getPort(WSServiceDelegate.java:404)
at com.sun.xml.internal.ws.client.WSServiceDelegate.getPort(WSServiceDelegate.java:386)
at javax.xml.ws.Service.getPort(Service.java:119)
at com.abc.xyz.remoteuserstore.client.RemoteUserStoreManagerService.getRemoteUserStoreManagerServiceHttpsSoap11Endpoint(RemoteUserStoreManagerService.java:72)
at com.abc.xyz.portal.service.UserAdminServiceClient.<init>(UserAdminServiceClient.java:47)
at com.abc.xyz.portal.service.UserAdminServiceClient.main(UserAdminServiceClient.java:190)

这是因为 WSO2IS 正在处理 JAVA6 而我使用 JAVA8 来调用服务吗?

我无法理解我哪里出错了。

任何帮助将不胜感激。

【问题讨论】:

  • 在之前的碳产品版本中,java 8 存在一些已知问题。使用 java 6/7 可以避免这些问题。 (这些将在即将发布的版本中修复)
  • 我正在使用 WSO2 5.0.0 SP1。这会导致这个问题吗?
  • afaik 它还没有准备好 java8。所以最好使用 6/7 来避免问题。
  • 感谢您的回复。最后一个问题。我在 JAVA 6 上运行 WSO2,它运行良好。现在我有一个需要在 JAVA 8 中开发的客户端,它使用 WSO2 的 Web 服务。这也会是一个问题吗?客户端是否也应该在 JAVA 6/7 上。
  • 客户端的java版本不应该影响这里。但是一个问题可能是它(客户端)依赖于与 java 8 不兼容的axis2版本。除此之外,它应该可以工作。

标签: web-services java-8 wso2 jax-ws wso2is


【解决方案1】:

我终于想出了一些解决我的任务的方法。可能不是最好的答案,但它仍然可以解渴

在为服务 (/services/RemoteUserStoreManagerService?wsdl) 创建存根时,我们面临一些返回类型为 void 的方法的问题:

[ERROR] operation "updateCredential" has an invalid style
  line 721 of file:/G:/agent/RemoteUserService.xml

[ERROR] operation "setUserClaimValue" has an invalid style
  line 725 of file:/G:/agent/RemoteUserService.xml
.....

要解决这个问题,我们必须篡改 wsdl 文件,如下面的链接所述:

Generating stubs with jax-ws fails

http://www.vitharana.org/2015/02/jax-ws-client-for-authenticate-to-wso2.html

还有

https://briskwalk.wordpress.com/2012/03/30/a-classinterface-with-the-same-name-is-already-in-use-error-when-generating-stubs-for-net-service-using-jdk-6-wsimport-command/

这会生成可用于 JAVA 6 和 JAVA 8 的存根。

现在在 JAVA 6 中

生成的存根在 JAVA 6 中就像小菜一碟,因为 JAX-WS 实现忽略了 void 方法的(上面添加的)输出标记。

在 JAVA 8 中

JAX-WS 实现不会忽略(上面添加的)输出标记,因此会引发第一个错误

Exception in thread "main" javax.xml.ws.WebServiceException: No response returned.
at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:98)
at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:77)
at com.sun.xml.internal.ws.client.sei.SEIStub.invoke(SEIStub.java:147)
at com.sun.proxy.$Proxy34.updateRoleListOfUser(Unknown Source) 
at com.abc.xyz.portal.service.UserAdminServiceClient.updateUser(UserAdminServiceClient.java:181)
at com.abc.xyz.portal.service.UserAdminServiceClient.main(UserAdminServiceClient.java:192)

当我们在 JAVA 8 中使用带有 URL 的构造函数时,JAX-WS 实现会尝试直接与 WSDL 通信。现在由于 WSDL 没有 void 方法的输出标记,因此导致第二个错误。

Exception in thread "main" java.lang.NullPointerException
at com.sun.xml.internal.ws.model.JavaMethodImpl.freeze(JavaMethodImpl.java:379)
at com.sun.xml.internal.ws.model.AbstractSEIModelImpl.freeze(AbstractSEIModelImpl.java:105)
at com.sun.xml.internal.ws.model.RuntimeModeler.buildRuntimeModel(RuntimeModeler.java:320)
at com.sun.xml.internal.ws.db.DatabindingImpl.<init>(DatabindingImpl.java:85)
at com.sun.xml.internal.ws.db.DatabindingProviderImpl.create(DatabindingProviderImpl.java:59)
at com.sun.xml.internal.ws.db.DatabindingProviderImpl.create(DatabindingProviderImpl.java:43)
at com.sun.xml.internal.ws.db.DatabindingFactoryImpl.createRuntime(DatabindingFactoryImpl.java:105)
at com.sun.xml.internal.ws.client.WSServiceDelegate.buildRuntimeModel(WSServiceDelegate.java:875)
at com.sun.xml.internal.ws.client.WSServiceDelegate.createSEIPortInfo(WSServiceDelegate.java:892)
at com.sun.xml.internal.ws.client.WSServiceDelegate.addSEI(WSServiceDelegate.java:855)
at com.sun.xml.internal.ws.client.WSServiceDelegate.getPort(WSServiceDelegate.java:435)
at com.sun.xml.internal.ws.client.WSServiceDelegate.getPort(WSServiceDelegate.java:404)
at com.sun.xml.internal.ws.client.WSServiceDelegate.getPort(WSServiceDelegate.java:386)
at javax.xml.ws.Service.getPort(Service.java:119)
at com.abc.xyz.remoteuserstore.client.RemoteUserStoreManagerService.getRemoteUserStoreManagerServiceHttpsSoap11Endpoint(RemoteUserStoreManagerService.java:72)
at com.abc.xyz.portal.service.UserAdminServiceClient.<init>(UserAdminServiceClient.java:47)
at com.abc.xyz.portal.service.UserAdminServiceClient.main(UserAdminServiceClient.java:190)

现在,如果您在构造函数中指向修改后的 wsdl 文件,则错误已解决。

从这一点可以得出结论,JAVA 6 到 JAVA 8 中的 JAX-WS 实现发生了一些变化。即 JAX-WS 2.0 到 JAX-WS 2.2

【讨论】:

    【解决方案2】:

    基于 WSO2 碳内核 4.2.0 的产品与 Java 8 不完全兼容。AFAIK 您必须将 Java 6 与这些产品一起使用。

    【讨论】:

      猜你喜欢
      • 2015-12-19
      • 2014-09-04
      • 2010-11-09
      • 2010-09-17
      • 2014-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多