2012-11-30 385 views
1

我有一個第三方jar包含類SampleClass與@javax.xml.ws.WebServiceClient註釋。我在我的項目中使用了CXF而不是Web服務。但是,由於CXF基礎架構是爲我的項目配置的,因此當我實例化它時,它試圖自動連接到SampleClass(實際上它試圖這樣做時會導致錯誤)。我想將該類用作簡單的POJO而不是Web服務客戶端。有沒有一種方法可以告訴CXF忽略@javax.xml.ws.WebServiceClient註釋?CXF客戶端:如何忽略@WebServiceClient註釋

只是爲了信息,我得到的例外是:在我們班,從服務延伸

java.lang.reflect.InvocationTargetException 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at org.apache.cxf.common.injection.ResourceInjector.invokePostConstruct(ResourceInjector.java:302) 
    at org.apache.cxf.common.injection.ResourceInjector.construct(ResourceInjector.java:86) 
    at org.apache.cxf.bus.spring.Jsr250BeanPostProcessor.postProcessAfterInitialization(Jsr250BeanPostProcessor.java:58) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:357) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1308) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:463) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:404) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:375) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:263) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:170) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:260) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:184) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:163) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:430) 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:729) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:381) 
    at org.apache.cxf.bus.spring.BusApplicationContext.<init>(BusApplicationContext.java:88) 
    at org.apache.cxf.bus.spring.SpringBusFactory.createApplicationContext(SpringBusFactory.java:103) 
    at org.apache.cxf.bus.spring.SpringBusFactory.createBus(SpringBusFactory.java:94) 
    at org.apache.cxf.bus.spring.SpringBusFactory.createBus(SpringBusFactory.java:87) 
    at org.apache.cxf.bus.spring.SpringBusFactory.createBus(SpringBusFactory.java:65) 
    at org.apache.cxf.bus.spring.SpringBusFactory.createBus(SpringBusFactory.java:54) 
    at org.apache.cxf.BusFactory.getDefaultBus(BusFactory.java:70) 
    at org.apache.cxf.BusFactory.getThreadDefaultBus(BusFactory.java:107) 
    at org.apache.cxf.BusFactory.getThreadDefaultBus(BusFactory.java:98) 
    at org.apache.cxf.jaxws.spi.ProviderImpl.createServiceDelegate(ProviderImpl.java:64) 
    at javax.xml.ws.Service.<init>(Unknown Source) 

Caused by: java.lang.NullPointerException 
    at org.apache.cxf.binding.corba.wsdl.WSDLExtensionRegister.createCompatExtensor(WSDLExtensionRegister.java:63) 
    at org.apache.cxf.binding.corba.wsdl.WSDLExtensionRegister.registerYokoCompatibleExtensors(WSDLExtensionRegister.java:47) 
    ... 34 more 
java.lang.ExceptionInInitializerError 

Caused by: java.lang.NullPointerException 
    at org.apache.cxf.wsdl11.WSDLServiceFactory.<init>(WSDLServiceFactory.java:81) 
    at org.apache.cxf.jaxws.ServiceImpl.initializePorts(ServiceImpl.java:141) 
    at org.apache.cxf.jaxws.ServiceImpl.<init>(ServiceImpl.java:133) 
    at org.apache.cxf.jaxws.spi.ProviderImpl.createServiceDelegate(ProviderImpl.java:65) 
    at javax.xml.ws.Service.<init>(Unknown Source) 

回答

0

我們曾使用超()。 父「服務」類中的代碼是

http://grepcode.com/file/repo1.maven.org/maven2/javax.xml.ws/jaxws-api/2.2.8/javax/xml/ws/Service.java#92

後者又調用的靜態方法「Provider.provider()」,以在運行時加載 提供商。 代碼這是對這種方法

http://grepcode.com/file/repo1.maven.org/maven2/javax.xml.ws/jaxws-api/2.2.8/javax/xml/ws/spi/Provider.java#Provider.provider%28%29

Javadoc註釋是:

塊引用

創建一個新的提供對象。

用於定位提供商子類使用的算法由 以下步驟:

  • 如果用的META-INF /服務名稱/ javax.xml.ws.spi.Provider 資源存在,則其第一行(如果存在)用作實現類的UTF-8編碼名稱 。
  • 如果$ java.home/lib/jaxws.properties文件存在,並且可通過 讀取java.util.Properties.load(InputStream)方法,它包含條目 ,其鍵爲javax.xml.ws。 spi.Provider,那麼該條目的值將被用作實現類的名稱 。
  • 如果定義了名稱爲javax.xml.ws.spi.Provider的系統屬性,則其值爲 ,則其值將用作實現類的名稱。
  • 最後,使用默認實現類名稱。

塊引用

CXF似乎選擇加載其Provider實現第一種方式。即: 「如果存在名稱爲META-INF/services/javax.xml.ws.spi.Provider 的資源,則其第一行(如果存在)用作實現的UTF-8編碼名稱 類。」

CXF jar將這個文件放在jar文件中,提供了一個提供者類作爲CXF實現。由於這是用於查找的第一件事,CXF的提供者將被加載而不是默認的提供者。但是,我們的實現期望默認提供者被加載。

我們可以想到的唯一可行的工作是在META-INF \ services下自己添加文件javax.xml.ws.spi.Provider,並將提供程序指定爲默認實現類com.sun.xml.internal .ws.spi.ProviderImpl。唯一的風險是類com.sun.xml.internal.ws.spi.ProviderImpl是JRE的內部實現,並且不綁定到API合同。所以類名/包可能會隨着將來的版本而改變。