生成的代码导致JAXBException

时间:2013-02-01 19:03:46

标签: java web-services maven jaxb websphere

我收到了以下形式

的JAXBException
  

类SomeClass或其任何超类都是这个上下文已知的。

完整堆栈跟踪如下所示:

 javax.xml.ws.WebServiceException: javax.xml.bind.JAXBException: class com.myCompany.generatedCode.WebServiceOperationName nor any of its super class is 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.core.controller.impl.AxisInvocationController.execute(AxisInvocationController.java:586)
    at org.apache.axis2.jaxws.core.controller.impl.AxisInvocationController.doInvoke(AxisInvocationController.java:130)
    at org.apache.axis2.jaxws.core.controller.impl.InvocationControllerImpl.invoke(InvocationControllerImpl.java:93)
    at org.apache.axis2.jaxws.client.proxy.JAXWSProxyHandler.invokeSEIMethod(JAXWSProxyHandler.java:364)
    at org.apache.axis2.jaxws.client.proxy.JAXWSProxyHandler.invoke(JAXWSProxyHandler.java:185)
    at $Proxy41.deleteAccount(Unknown Source)
    at com.myCompany.myPackage.MyWebServiceClient.callSomeWebService(MyWebServiceClient.java:100)
(other classes specific to my application and framework)
...
Caused by: 
javax.xml.bind.JAXBException: class com.myCompany.generatedCode.WebServiceOperationName nor any of its super class is known to this context.
    at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.getBeanInfo(JAXBContextImpl.java:556)
    at com.sun.xml.internal.bind.v2.runtime.XMLSerializer.childAsRoot(XMLSerializer.java:452)
    at com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:314)
    at com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.marshal(MarshallerImpl.java:243)
    at javax.xml.bind.helpers.AbstractMarshallerImpl.marshal(AbstractMarshallerImpl.java:75)
    at com.ibm.xml.xlxp2.jaxb.marshal.MarshallerProxy.marshal(MarshallerProxy.java:100)
    at org.apache.axis2.datasource.jaxb.JAXBDSContext$1.run(JAXBDSContext.java:470)
    at org.apache.axis2.java.security.AccessController.doPrivileged(AccessController.java:76)
    at org.apache.axis2.datasource.jaxb.JAXBDSContext.marshalByElement(JAXBDSContext.java:455)
    at org.apache.axis2.datasource.jaxb.JAXBDSContext.marshal(JAXBDSContext.java:414)
    at org.apache.axis2.jaxws.message.databinding.impl.JAXBBlockImpl._outputFromBO(JAXBBlockImpl.java:189)
    at org.apache.axis2.jaxws.message.impl.BlockImpl.outputTo(BlockImpl.java:372)
    at org.apache.axis2.jaxws.message.impl.BlockImpl.serialize(BlockImpl.java:296)
    at org.apache.axiom.om.impl.llom.OMSourcedElementImpl.internalSerializeAndConsume(OMSourcedElementImpl.java:808)
    at org.apache.axiom.om.impl.llom.OMElementImpl.internalSerialize(OMElementImpl.java:975)
    at org.apache.axiom.om.impl.llom.OMElementImpl.internalSerializeAndConsume(OMElementImpl.java:1016)
    at org.apache.axiom.soap.impl.llom.SOAPEnvelopeImpl.serializeInternally(SOAPEnvelopeImpl.java:271)
    at org.apache.axiom.soap.impl.llom.SOAPEnvelopeImpl.internalSerialize(SOAPEnvelopeImpl.java:233)
    at org.apache.axiom.om.impl.llom.OMElementImpl.internalSerializeAndConsume(OMElementImpl.java:1016)
    at org.apache.axiom.om.impl.llom.OMNodeImpl.serializeAndConsume(OMNodeImpl.java:488)
    at org.apache.axis2.transport.http.SOAPMessageFormatter.writeTo(SOAPMessageFormatter.java:88)
    at com.ibm.ws.websvcs.transport.http.SOAPOverHTTPSender.writeMessage(SOAPOverHTTPSender.java:3271)
    at com.ibm.ws.websvcs.transport.http.SOAPOverHTTPSender.sendChunkedRequest(SOAPOverHTTPSender.java:888)
    at com.ibm.ws.websvcs.transport.http.SOAPOverHTTPSender.sendSOAPRequest(SOAPOverHTTPSender.java:807)
    at com.ibm.ws.websvcs.transport.http.SOAPOverHTTPSender.send(SOAPOverHTTPSender.java:611)
    at com.ibm.ws.websvcs.transport.http.HTTPTransportSender.invoke(HTTPTransportSender.java:364)
    at org.apache.axis2.engine.AxisEngine.send(AxisEngine.java:531)
    at org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.java:401)
    at org.apache.axis2.description.OutInAxisOperationClient.executeImpl(OutInAxisOperation.java:228)
    at org.apache.axis2.client.OperationClient.execute(OperationClient.java:163)
    at org.apache.axis2.jaxws.core.controller.impl.AxisInvocationController.execute(AxisInvocationController.java:581)
    ... 52 more

触发此操作的是尝试调用名为WebServiceOperationName的Web服务操作。我已经看到了处理此错误的其他提示,通常涉及添加@XmlSeeAlso注释或调整编组和解组的方式。

在这种情况下,我正在调用一个Web服务,其代码由Maven基于WSDL(和支持模式)生成。我没有直接控制Maven生成的代码,而且我无法控制marshall / unmarshall调用。应用程序中的其他Web服务调用似乎没有任何问题。

更奇怪的是,我无法在我的本地服务器上重现这一点,尽管它发生在开发服务器上。生成的Web服务JAR与应用程序代码的其余部分相同。

这个例外本周突然出现(并且一直如此),我怀疑环境有所改变,但我不确定是什么。有什么想法吗?


一个新观察:

我第一次尝试在服务器启动/重新启动后运行此代码时,它需要一段时间(大约一分钟)才能失败并抛出异常。每次之后,异常几乎是瞬间......


更多信息:

WebSphere 7.0.0.23(在服务器上)存在此问题,但在WebSphere 7.0.0.7中(在工作站上)不存在。

2 个答案:

答案 0 :(得分:2)

问题已经解决。我正在检查包含WAS正在抱怨的类的jar,并注意到某些类在不同级别的包层次结构中重复。值得指出的是,原始错误中报告的类实际上并不是这些重复类中的一个。此外,应用程序没有引用同一类的不同变体 - 引用的类在预期的包中。一个级别的额外重复项没有在任何地方引用(据我所知)。

看起来就像一个糟糕的Maven配置,但是当我检查xjb绑定文件时,我无法弄清楚该架构命名空间中的类型如何绑定到两个不同的包。无论哪种方式,我清理了Maven使用的一些绑定文件,将重构的公共绑定放到一个文件中,让Maven重建jar,然后测试,突然问题就消失了!

显然WAS 7.0.0.23中存在问题,因为原始jar在WAS 7.0.0.7上运行良好。 可能是由Maven绑定问题引起的,导致看起来很奇怪但技术上有效的jar。

同样有趣的是:我们的一位开发人员将WAS升级到7.0.0.25并使用了原来的“坏”jar并且出现了“没有这样的操作”错误,而不是JAXBException。

答案 1 :(得分:1)

我在Guidewire ClaimCenter中遇到了同样的问题,这是一个可以配置的保险应用程序,但核心根本无法修改,它是基于Java的,它包含了像axis2这样的组件,但我创建了一个单独的java项目,它包装在webservice调用中,我使用wsimport创建了所有存根代码。它在我的开发环境中运行良好,这是windows和jetty因为是Guidewire平台来配置它(没有其他选择)。我们使用WAS 7作为生产服务器。

    Caused by: javax.xml.ws.WebServiceException: javax.xml.bind.JAXBException: au.com.mycompany.policyinquiry.retrieveinsurancepolicydetails.v1.RetrieveInsurancePolicyDetailsResp 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.DocLitBareMinimalMethodMarshaller.demarshalResponse(DocLitBareMinimalMethodMarshaller.java:158)
    at org.apache.axis2.jaxws.client.proxy.JAXWSProxyHandler.createResponse(JAXWSProxyHandler.java:499)
    at org.apache.axis2.jaxws.client.proxy.JAXWSProxyHandler.invokeSEIMethod(JAXWSProxyHandler.java:377)
    at org.apache.axis2.jaxws.client.proxy.JAXWSProxyHandler.invoke(JAXWSProxyHandler.java:185)
    at $Proxy80.retrieveInsurancePolicyDetails(Unknown Source)

我试图在服务器端生成和编译客户端,以防万一它与不同的JDK平台有关,但这并没有解决问题。 我找到了下一篇文章was 6!  但对于WAS 6,我没有尝试过。

    When the JAX-WS web service engine receives a message, it uses
    the JAXB engine to convert the message into java beans.
    The message indicates a failure occurred while converting xml
    into an object of type
    com.somecom.lib.business.xml.ComIdentifierXml.  The failure
    indicates that the JAXB engine was not initialized with
    information about this user class.
    .
    In this use case, the class
    com.somecom.lib.business.xml.ComIdentifierXml is packaged in a
    JAR at the EAR level. The exception does not happen if the
    class is packaged in a JAR located in the WAR module's
    WEB-INF/lib directory.
SOLUTION:

目标环境: IBM服务器 IBM JDK 1.6 IBM Webpshere 7.0.0.25

调用webservice的客户端使用的是纯JAVA,不依赖于外部库JAX-WS RI 2.1.6

在webspehre 1-为应用程序设置最后加载到父级的类 2-使用以下命令关闭webservice注释:将com.ibm.websphere.webservices.DisableIBMJAXWSEngine属性设置为true。这将禁用基于修改后的Axis2的Websphere自己的实现 3-使用第三方JAX-WS运行时部署应用程序 在我的情况下,我使用了Glassfish Metro 1.5,其中包括JAX-WS RI 2.1.7,与JDK 1.6.0_37的本地环境相同

就是这样

干杯 亚历克斯:)