我面临一个JAXBException“当这个上下文不知道”从Quartz on Spring控制的作业中调用Web服务时:
javax.xml.ws.WebServiceException: javax.xml.bind.JAXBException: com.xxxx.yyyy.zzzz.ImageMetaData is not known to this context
at org.apache.axis2.jaxws.ExceptionFactory.createWebServiceException(ExceptionFactory.java:175)
at org.apache.axis2.jaxws.ExceptionFactory.makeWebServiceException(ExceptionFactory.java:70)
at org.apache.axis2.jaxws.ExceptionFactory.makeWebServiceException(ExceptionFactory.java:128)
at org.apache.axis2.jaxws.marshaller.impl.alt.DocLitWrappedMinimalMethodMarshaller.demarshalResponse(DocLitWrappedMinimalMethodMarshaller.java:624)
at org.apache.axis2.jaxws.client.proxy.JAXWSProxyHandler.createResponse(JAXWSProxyHandler.java:593)
at org.apache.axis2.jaxws.client.proxy.JAXWSProxyHandler.invokeSEIMethod(JAXWSProxyHandler.java:432)
at org.apache.axis2.jaxws.client.proxy.JAXWSProxyHandler.invoke(JAXWSProxyHandler.java:213)
at com.sun.proxy.$Proxy299.findAllImageMetaData(Unknown Source)
我正在使用在IBM WebSphere v8上运行的JSF的Spring 3.2.4 Java EE应用程序。 当从应用程序的JSF部分(即从动作或服务)调用特定的Web服务时,一切都没问题。 只有在Quartz / Spring触发的作业中完成调用时才会发生异常。 从操作中执行完全相同的作业代码不会导致异常。
我尝试了很多不同的东西,比如在JAXB生成的类中使用相应的@XmlSeeAlso注释,但即使在webservice接口中使用注释本身也无法解决问题。
我还将Spring和Quartz库更新为更新的版本,但这没有帮助。
有人有任何想法吗?
答案 0 :(得分:1)
我终于解决了这个问题。 经过大量分析后,我在Spring框架中遇到了以下问题:
https://jira.spring.io/i#browse/SPR-11125
在WebSphere上通过Spring / Quartz触发作业时,会设置错误的ContextClassLoader。 这可能会导致许多不同的问题 - 其中包括所描述的JAXBException。
Spring bug仍然是开放的 - 所以作为一种解决方法,我必须用正确的方法覆盖当前线程的上下文类加载器:
ClassLoader cl = invoiceService.getClass().getClassLoader();
Thread.currentThread().setContextClassLoader(cl);
可以通过容器加载的类简单地检索正确的类加载器。使用此类加载器作为当前线程的上下文类加载器解决了我的问题。