1

@javax.xml.ws.WebServiceClientアノテーション付きのクラスSampleClassを含むサードパーティのjarがあります。プロジェクトでCXFをWebサービスではなくRESTレイヤーに使用しました。ただし、CXFインフラストラクチャはプロジェクト用に構成されているため、インスタンス化するときにSampleClassに自動配線しようとしています(実際、そうしようとするとエラーが発生します)。このクラスをWebサービスクライアントではなく単純なPOJOとして使用したいと思います。@javax.xml.ws.WebServiceClient注釈を無視するようにCXFに指示する方法はありますか?

参考までに、私が得る例外は次のとおりです。

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)
4

1 に答える 1

0

Service から拡張されたクラスで Super() を使用しました。親「サービス」クラスのコードは

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/services/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 は、プロバイダの実装をロードする最初の方法を選択したようです。つまり、「META-INF/services/javax.xml.ws.spi.Provider という名前のリソースが存在する場合、その最初の行が存在する場合は、実装クラスの UTF-8 エンコード名として使用されます。」

CXF jar には、このファイルが jar 内にあり、CXF 実装として言及されている Provider クラスがあります。これはルックアップに使用される最初のものであるため、デフォルト プロバイダーの代わりに CXF のプロバイダーが読み込まれます。ただし、私たちの実装では、既定のプロバイダーが読み込まれることを想定していました。

考えられる唯一の回避策は、ファイル javax.xml.ws.spi.Provider を META-INF\services の下に追加し、プロバイダーをデフォルトの実装クラス com.sun.xml.internal.ws.spi として指定することです。 .ProviderImpl. これに関する唯一のリスクは、クラス com.sun.xml.internal.ws.spi.ProviderImpl が JRE の内部実装であり、API コントラクトにバインドされていないことです。そのため、クラス名/パッケージは将来のリリースで変更される可能性があります。

于 2012-12-06T06:51:02.293 に答える