gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 22:25:51 24 4
gpt4 key购买 nike

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

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

我正在使用 JaxWsProxyFactoryBean 原型(prototype)的 create 方法来创建端口原型(prototype),但是它在 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文件中的class文件。最后发现getPackage方法返回null,于是继续阅读java源码中关于getPackage方法的内容。

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

在 IDE 中,我的代码使用的是 Java 默认类加载器,但在我的 Tomcat 中使用的是其他人编写的类加载器。而类加载器的findClass方法没有调用definePackage方法,所以getPackage方法返回null。然后我编辑类加载器,问题解决了。

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

关于java - CXF 客户端在 MyEclipse 中工作正常,但在 Tomcat 中出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44877146/

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