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

时间:2017-07-03 02:52:22

标签: java web-services tomcat cxf webservice-client

我的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)

1 个答案:

答案 0 :(得分:0)

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

我读了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。然后我编辑了类加载器,解决了问题。

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