java - 由生成的代码引起的 JAXBException

标签 java web-services maven jaxb websphere

我收到以下形式的 JAXBException

class SomeClass nor any of its super class is known to this context.

完整的堆栈跟踪如下所示:

 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(位于工作站上)中。

最佳答案

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

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

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

同样有趣的是:我们的一位开发人员将 WAS 升级到 7.0.0.25 并使用了原始的“坏”jar,并得到了“无此类操作”错误,而不是 JAXBException。

关于java - 由生成的代码引起的 JAXBException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14653281/

相关文章:

android - 从 Android 调用 REST (POST) 网络服务

android - 如何通过 USB 从无根的 Android 设备访问在 Win7 PC 上运行的 Web 服务?

asp.net - Web 服务和 asp.net 应用程序之间的共享 session

tomcat - Vaadin 与 maven 项目部署在 tomcat 中

java - Java 字符串是如何工作的

java - 如果用户同时具有两个角色,则允许访问 Spring Security 中的用户

java - 需要在 if else 语句中切换 boolean 值

maven - 如何找到请求丢失 POM 的 POM?

java - 在编辑器中显示 IntelliJ-idea 中的编译错误

java 8接口(interface)默认方法返回类型不明确