gpt4 book ai didi

java - CXF客户端: How to ignore @WebServiceClient annotation

转载 作者:行者123 更新时间:2023-12-01 04:58:52 29 4
gpt4 key购买 nike

我有一个第三方 jar,其中包含带有 @javax.xml.ws.WebServiceClient 注释的 SampleClass 类。我在我的项目中将 CXF 用于 REST 层,而不是用于 Web 服务。但是,由于 CXF 基础设施是为我的项目配置的,因此当我实例化它时,它会尝试自动连接到 SampleClass (事实上,在尝试这样做时它会出现错误)。我想将该类用作简单的 POJO,而不是 Web 服务客户端。有没有办法让 CXF 忽略 @javax.xml.ws.WebServiceClient 注释?

仅供引用,我得到的异常(exception)是:

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)

最佳答案

我们在我们的类中使用了从 Service 扩展而来的 Super()。父“Service”类的代码是

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对此方法的注释是:

Blockquote

创建一个新的提供者对象。

用于定位要使用的提供者子类的算法包括以下步骤:

  • 如果资源名称为 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 的系统属性,然后它的值用作实现类的名称。
  • 最后,使用默认的实现类名称。

Blockquote

CXF 似乎选择了第一种方式来加载其 Provider 实现。 IE: “如果名称为 META-INF/services/javax.xml.ws.spi.Provider 的资源存在,则其第一行(如果存在)用作 UTF-8 编码名称实现类的。”

CXF jar 在 jar 中包含此文件,其中提到 Provider 类作为 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 契约的约束。因此,类名/包可能会随着 future 的版本而改变。

关于java - CXF客户端: How to ignore @WebServiceClient annotation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13641248/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com