在 weblogic 12.2.1.3 上创建 javax.xml.ws.Service 实例时出现 NullPointerException
NullPointerException when creating instance of javax.xml.ws.Service on weblogic 12.2.1.3
我们有一个由 JAX-WS RI 2.2.9-b130926.1035 生成的 EshopService_Service class - 生成的源版本:来自 wsdl 文件的 2.2。
从 weblogic 版本 12.1.2.0.0 升级到 12.2.1.3 后,我们在创建服务实例时得到了这个堆栈:
java.lang.NullPointerException
at com.oracle.webservices.impl.wsdl.WSDLBoundOperationImpl.<init>(WSDLBoundOperationImpl.java:540)
at com.oracle.webservices.impl.wsdl.WSDLBoundPortTypeImpl.<init>(WSDLBoundPortTypeImpl.java:80)
at com.oracle.webservices.impl.wsdl.WSDLModelImpl.mapBindings(WSDLModelImpl.java:169)
at com.oracle.webservices.impl.wsdl.WSDLModelImpl.mapBindings(WSDLModelImpl.java:189)
at com.oracle.webservices.impl.wsdl.WSDLModelImpl.<init>(WSDLModelImpl.java:48)
at com.oracle.webservices.impl.wsdl.WSDLConverterImpl.wsdlModelFromDefinition(WSDLConverterImpl.java:292)
at com.oracle.webservices.impl.wsdl.WSDLConverterImpl.getWSDLModel(WSDLConverterImpl.java:248)
at com.oracle.webservices.impl.wsdl.WSDLConverterImpl.getWSDLService(WSDLConverterImpl.java:303)
at weblogic.wsee.jaxws.spi.WLSProvider$ServiceDelegateImpl.<init>(WLSProvider.java:1124)
at weblogic.wsee.jaxws.spi.WLSProvider.createServiceDelegate(WLSProvider.java:223)
at weblogic.wsee.jaxws.spi.WLSProvider.createServiceDelegate(WLSProvider.java:150)
at javax.xml.ws.Service.<init>(Service.java:77)
at xx.xx.xxxxxxx.services.eshop.EshopService_Service.<init>(EshopService_Service.java:40)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at org.codehaus.groovy.reflection.CachedConstructor.invoke(CachedConstructor.java:83)
at org.codehaus.groovy.runtime.callsite.ConstructorSite$ConstructorSiteNoUnwrapNoCoerce.callConstructor(ConstructorSite.java:105)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallConstructor(CallSiteArray.java:59)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callConstructor(AbstractCallSite.java:238)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callConstructor(AbstractCallSite.java:242)
at com.xxx.prj.xxx.col.integration.business.IntegrationService.getEshopServicePort(IntegrationService.groovy:39)
at com.xxx.prj.xxxx.col.integration.business.IntegrationService.<init>(IntegrationService.groovy:46)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
WSDLBoundOperationImpl 是 weblogic 的内部 class,网络上没有关于 class 的信息…
我们已经反编译了 class WSDLBoundOperationImpl,它看起来在 owner.getPortType().get(this.name);
when owner.getPortType() returns null...
上失败了
事实是我们的 WSDL 不包含任何“portType”元素,但 portType 不是必需的 wsdl 指令,并且相同的 WSDL 在 Weblogic 版本 12.1.2.0.0 中运行良好。
如何解决这个问题?我们无法更改 wsdl 文件的内容...
谢谢。
看起来我找到了解决方法...Weblogic 正在使用其自己的 jax ws Provider 实现...但是使用 https://docs.oracle.com/cd/E24329_01/web.1211/e24964/data_types.htm#WSGET348 功能您可以将 javax.xml.ws.spi.Provider
定义为(在我的例子中) org.apache.cxf.jaxws.spi.ProviderImpl
... 然后,在创建服务实例时,作为提供者使用 apace.cxf 提供者的实例...
我们有一个由 JAX-WS RI 2.2.9-b130926.1035 生成的 EshopService_Service class - 生成的源版本:来自 wsdl 文件的 2.2。
从 weblogic 版本 12.1.2.0.0 升级到 12.2.1.3 后,我们在创建服务实例时得到了这个堆栈:
java.lang.NullPointerException
at com.oracle.webservices.impl.wsdl.WSDLBoundOperationImpl.<init>(WSDLBoundOperationImpl.java:540)
at com.oracle.webservices.impl.wsdl.WSDLBoundPortTypeImpl.<init>(WSDLBoundPortTypeImpl.java:80)
at com.oracle.webservices.impl.wsdl.WSDLModelImpl.mapBindings(WSDLModelImpl.java:169)
at com.oracle.webservices.impl.wsdl.WSDLModelImpl.mapBindings(WSDLModelImpl.java:189)
at com.oracle.webservices.impl.wsdl.WSDLModelImpl.<init>(WSDLModelImpl.java:48)
at com.oracle.webservices.impl.wsdl.WSDLConverterImpl.wsdlModelFromDefinition(WSDLConverterImpl.java:292)
at com.oracle.webservices.impl.wsdl.WSDLConverterImpl.getWSDLModel(WSDLConverterImpl.java:248)
at com.oracle.webservices.impl.wsdl.WSDLConverterImpl.getWSDLService(WSDLConverterImpl.java:303)
at weblogic.wsee.jaxws.spi.WLSProvider$ServiceDelegateImpl.<init>(WLSProvider.java:1124)
at weblogic.wsee.jaxws.spi.WLSProvider.createServiceDelegate(WLSProvider.java:223)
at weblogic.wsee.jaxws.spi.WLSProvider.createServiceDelegate(WLSProvider.java:150)
at javax.xml.ws.Service.<init>(Service.java:77)
at xx.xx.xxxxxxx.services.eshop.EshopService_Service.<init>(EshopService_Service.java:40)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at org.codehaus.groovy.reflection.CachedConstructor.invoke(CachedConstructor.java:83)
at org.codehaus.groovy.runtime.callsite.ConstructorSite$ConstructorSiteNoUnwrapNoCoerce.callConstructor(ConstructorSite.java:105)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallConstructor(CallSiteArray.java:59)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callConstructor(AbstractCallSite.java:238)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callConstructor(AbstractCallSite.java:242)
at com.xxx.prj.xxx.col.integration.business.IntegrationService.getEshopServicePort(IntegrationService.groovy:39)
at com.xxx.prj.xxxx.col.integration.business.IntegrationService.<init>(IntegrationService.groovy:46)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
WSDLBoundOperationImpl 是 weblogic 的内部 class,网络上没有关于 class 的信息…
我们已经反编译了 class WSDLBoundOperationImpl,它看起来在 owner.getPortType().get(this.name);
when owner.getPortType() returns null...
事实是我们的 WSDL 不包含任何“portType”元素,但 portType 不是必需的 wsdl 指令,并且相同的 WSDL 在 Weblogic 版本 12.1.2.0.0 中运行良好。
如何解决这个问题?我们无法更改 wsdl 文件的内容...
谢谢。
看起来我找到了解决方法...Weblogic 正在使用其自己的 jax ws Provider 实现...但是使用 https://docs.oracle.com/cd/E24329_01/web.1211/e24964/data_types.htm#WSGET348 功能您可以将 javax.xml.ws.spi.Provider
定义为(在我的例子中) org.apache.cxf.jaxws.spi.ProviderImpl
... 然后,在创建服务实例时,作为提供者使用 apace.cxf 提供者的实例...