CXF 客户端在 MyEclipse 中工作正常,但在 Tomcat 中出现错误



我的CXF版本是2.6.16,JDK是1.5,Tomcat的版本是5.0。

正如标题所说,客户端可以在 IDE 中成功调用服务,但不能在 Web 容器中成功调用服务。我认为MyEclipse运行时环境和Tomcat的运行时环境之间可能存在一些差异,但我不知道它是什么。

我正在使用JaxWsProxyFactoryBean原型的create方法来创建端口原型,但是它在Tomcat中抛出了一个异常。

下面是错误堆栈信息。

Caused by: java.lang.NullPointerException
at org.apache.cxf.jaxb.Utils.getFieldXJTA(Utils.java:269)
at org.apache.cxf.jaxb.JAXBContextInitializer.walkReferences(JAXBContextInitializer.java:357)
at org.apache.cxf.jaxb.JAXBContextInitializer.addClass(JAXBContextInitializer.java:329)
at org.apache.cxf.jaxb.JAXBContextInitializer.addType(JAXBContextInitializer.java:232)
at org.apache.cxf.jaxb.JAXBContextInitializer.begin(JAXBContextInitializer.java:139)
at org.apache.cxf.service.ServiceModelVisitor.visitOperation(ServiceModelVisitor.java:97)
at org.apache.cxf.service.ServiceModelVisitor.walk(ServiceModelVisitor.java:74)
at org.apache.cxf.jaxb.JAXBDataBinding.initialize(JAXBDataBinding.java:325)
at org.apache.cxf.service.factory.AbstractServiceFactoryBean.initializeDataBindings(AbstractServiceFactoryBean.java:86)
at org.apache.cxf.service.factory.ReflectionServiceFactoryBean.buildServiceFromClass(ReflectionServiceFactoryBean.java:490)
at org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean.buildServiceFromClass(JaxWsServiceFactoryBean.java:697)
at org.apache.cxf.service.factory.ReflectionServiceFactoryBean.initializeServiceModel(ReflectionServiceFactoryBean.java:550)
at org.apache.cxf.service.factory.ReflectionServiceFactoryBean.create(ReflectionServiceFactoryBean.java:265)
at org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean.create(JaxWsServiceFactoryBean.java:214)
at org.apache.cxf.frontend.AbstractWSDLBasedEndpointFactory.createEndpoint(AbstractWSDLBasedEndpointFactory.java:101)
at org.apache.cxf.frontend.ClientFactoryBean.create(ClientFactoryBean.java:90)
at org.apache.cxf.frontend.ClientProxyFactoryBean.create(ClientProxyFactoryBean.java:155)
at org.apache.cxf.jaxws.JaxWsProxyFactoryBean.create(JaxWsProxyFactoryBean.java:156)

最后,我自己解决了这个问题。希望这次经历可以帮助某人。

我阅读了org.apache.cxf.jaxb.Utils.getFieldXJTA(Utils.java:269(的源代码,其中错误堆栈信息写在第一行。

XmlJavaTypeAdapters adapters = f.getDeclaringClass().getPackage().getAnnotation(XmlJavaTypeAdapters.class);

如您所见,getDeclaringClass 方法或 getPackage 方法之一必须返回 null ,因此可能会发生异常。但我不知道哪一个是正确的。所以我像这样编辑源代码:

Class<?> clazz = f.getDeclaringClass();
Package pkg = clazz.getPackage();
XmlJavaTypeAdapters adapters = pkg.getAnnotation(XmlJavaTypeAdapters.class);

并替换 jar 文件中的类文件。最后,我发现getPackage方法返回了null。然后我继续阅读有关getPackage方法的java源代码。

我发现很难让该方法返回 null,唯一的原因(只有我的想法(可能在类加载器中。

在IDE中,我的代码使用的是Java defalut类加载器,但是在我的Tomcat中使用的是其他人编写的类加载器。类加载器的 findClass 方法尚未调用 definePackage 方法,因此 getPackage 方法返回 null。然后我编辑类加载器,问题解决了。

感谢帮助我解决语法问题的人和回答我的人。

相关内容

  • 没有找到相关文章

最新更新