我的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。然后我编辑类加载器,问题解决了。
感谢帮助我解决语法问题的人和回答我的人。