Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java CXF客户端在MyEclipse中正常工作,但在Tomcat中出现错误_Java_Web Services_Tomcat_Cxf_Webservice Client - Fatal编程技术网

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

Java CXF客户端在MyEclipse中正常工作,但在Tomcat中出现错误,java,web-services,tomcat,cxf,webservice-client,Java,Web Services,Tomcat,Cxf,Webservice Client,我的CXF版本是2.6.16,JDK是1.5,Tomcat是5.0 正如标题所说,客户机可以在IDE中成功调用服务,但不能在web容器中调用。我认为MyEclipse运行时环境和Tomcat运行时环境可能有一些不同,但我不知道它是什么 我正在使用JaxWsProxyFactoryBeanprototype的create方法来创建端口原型,但是它在Tomcat中引发了一个异常 这是错误堆栈信息 Caused by: java.lang.NullPointerException at or

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

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

我正在使用
JaxWsProxyFactoryBean
prototype的
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);
Class clazz=f.getDeclaringClass();
Package pkg=clazz.getPackage();
XmlJavaTypeAdapters=pkg.getAnnotation(XmlJavaTypeAdapters.class);
并替换jar文件中的类文件。最后,我发现getPackage方法返回null。然后我继续阅读关于getPackage方法的java源代码

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

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


感谢在语法问题上帮助我的人和回答我的人。

最后,我自己解决了这个问题。希望这段经历能对某人有所帮助

我阅读了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);
Class clazz=f.getDeclaringClass();
Package pkg=clazz.getPackage();
XmlJavaTypeAdapters=pkg.getAnnotation(XmlJavaTypeAdapters.class);
并替换jar文件中的类文件。最后,我发现getPackage方法返回null。然后我继续阅读关于getPackage方法的java源代码

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

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


感谢在语法问题上帮助我的人和回答我的人。

我同意。这看起来像是类路径问题。因此,请发布MyEclipse使用的类路径以及Tomcat的启动日志。JAXB没有附带Java 5,所以我猜您已经在classpathCXF中安装了JAXB库JAXB的实现需要从ClassLoader加载输入和输出类的包,但是您的ClassLoader实现没有注册这些包。我同意。这看起来像是类路径问题。因此,请发布MyEclipse使用的类路径以及Tomcat的启动日志。JAXB没有附带Java 5,所以我猜您在classpathCXF中已经安装了JAXB库JAXB的实现需要从ClassLoader加载输入和输出类的包,但是ClassLoader实现没有注册这些包。