2

我收到以下形式的 JAXBException

类 SomeClass 或其任何超类在此上下文中是已知的。

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

javax.xml.ws.WebServiceException: javax.xml.bind.JAXBException: class com.myCompany.generatedCode.WebServiceOperationName 或其任何超类对此上下文都是未知的。
    在 org.apache.axis2.jaxws.ExceptionFactory.createWebServiceException(ExceptionFactory.java:175)
    在 org.apache.axis2.jaxws.ExceptionFactory.makeWebServiceException(ExceptionFactory.java:70)
    在 org.apache.axis2.jaxws.ExceptionFactory.makeWebServiceException(ExceptionFactory.java:128)
    在 org.apache.axis2.jaxws.core.controller.impl.AxisInvocationController.execute(AxisInvocationController.java:586)
    在 org.apache.axis2.jaxws.core.controller.impl.AxisInvocationController.doInvoke(AxisInvocationController.java:130)
    在 org.apache.axis2.jaxws.core.controller.impl.InvocationControllerImpl.invoke(InvocationControllerImpl.java:93)
    在 org.apache.axis2.jaxws.client.proxy.JAXWSProxyHandler.invokeSEIMethod(JAXWSProxyHandler.java:364)
    在 org.apache.axis2.jaxws.client.proxy.JAXWSProxyHandler.invoke(JAXWSProxyHandler.java:185)
    在 $Proxy41.deleteAccount(未知来源)
    在 com.myCompany.myPackage.MyWebServiceClient.callSomeWebService(MyWebServiceClient.java:100)
(特定于我的应用程序和框架的其他类)
...
造成的:
javax.xml.bind.JAXBException: com.myCompany.generatedCode.WebServiceOperationName 类或其任何超类对此上下文都是未知的。
    在 com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.getBeanInfo(JAXBContextImpl.java:556)
    在 com.sun.xml.internal.bind.v2.runtime.XMLSerializer.childAsRoot(XMLSerializer.java:452)
    在 com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:314)
    在 com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.marshal(MarshallerImpl.java:243)
    在 javax.xml.bind.helpers.AbstractMarshallerImpl.marshal(AbstractMarshallerImpl.java:75)
    在 com.ibm.xml.xlxp2.jaxb.marshal.MarshallerProxy.marshal(MarshallerProxy.java:100)
    在 org.apache.axis2.datasource.jaxb.JAXBDSContext$1.run(JAXBDSContext.java:470)
    在 org.apache.axis2.java.security.AccessController.doPrivileged(AccessController.java:76)
    在 org.apache.axis2.datasource.jaxb.JAXBDSContext.marshalByElement(JAXBDSContext.java:455)
    在 org.apache.axis2.datasource.jaxb.JAXBDSContext.marshal(JAXBDSContext.java:414)
    在 org.apache.axis2.jaxws.message.databinding.impl.JAXBBlockImpl._outputFromBO(JAXBBlockImpl.java:189)
    在 org.apache.axis2.jaxws.message.impl.BlockImpl.outputTo(BlockImpl.java:372)
    在 org.apache.axis2.jaxws.message.impl.BlockImpl.serialize(BlockImpl.java:296)
    在 org.apache.axiom.om.impl.llom.OMSourcedElementImpl.internalSerializeAndConsume(OMSourcedElementImpl.java:808)
    在 org.apache.axiom.om.impl.llom.OMElementImpl.internalSerialize(OMElementImpl.java:975)
    在 org.apache.axiom.om.impl.llom.OMElementImpl.internalSerializeAndConsume(OMElementImpl.java:1016)
    在 org.apache.axiom.soap.impl.llom.SOAPEnvelopeImpl.serializeInternally(SOAPEnvelopeImpl.java:271)
    在 org.apache.axiom.soap.impl.llom.SOAPEnvelopeImpl.internalSerialize(SOAPEnvelopeImpl.java:233)
    在 org.apache.axiom.om.impl.llom.OMElementImpl.internalSerializeAndConsume(OMElementImpl.java:1016)
    在 org.apache.axiom.om.impl.llom.OMNodeImpl.serializeAndConsume(OMNodeImpl.java:488)
    在 org.apache.axis2.transport.http.SOAPMessageFormatter.writeTo(SOAPMessageFormatter.java:88)
    在 com.ibm.ws.websvcs.transport.http.SOAPOverHTTPSender.writeMessage(SOAPOverHTTPSender.java:3271)
    在 com.ibm.ws.websvcs.transport.http.SOAPOverHTTPSender.sendChunkedRequest(SOAPOverHTTPSender.java:888)
    在 com.ibm.ws.websvcs.transport.http.SOAPOverHTTPSender.sendSOAPRequest(SOAPOverHTTPSender.java:807)
    在 com.ibm.ws.websvcs.transport.http.SOAPOverHTTPSender.send(SOAPOverHTTPSender.java:611)
    在 com.ibm.ws.websvcs.transport.http.HTTPTransportSender.invoke(HTTPTransportSender.java:364)
    在 org.apache.axis2.engine.AxisEngine.send(AxisEngine.java:531)
    在 org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.java:401)
    在 org.apache.axis2.description.OutInAxisOperationClient.executeImpl(OutInAxisOperation.java:228)
    在 org.apache.axis2.client.OperationClient.execute(OperationClient.java:163)
    在 org.apache.axis2.jaxws.core.controller.impl.AxisInvocationController.execute(AxisInvocationController.java:581)
    ... 52 更多

触发这种情况的原因是尝试调用名为WebServiceOperationName. 我已经看到了处理此错误的其他技巧,这些技巧通常涉及添加@XmlSeeAlso注释或调整编组和解组的方式。

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

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

这个例外在本周突然出现(并且一直如此),我怀疑环境发生了一些变化,但我不确定是什么。有任何想法吗?


一个新的观察:

我在服务器启动/重启后第一次尝试在服务器上运行此代码时,它需要一段时间(大约一分钟)才会失败并引发异常。之后的每一次,异常几乎都是瞬间的……


更多的信息:

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

4

2 回答 2

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。

于 2013-02-21T16:50:48.047 回答
1

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

    引起:javax.xml.ws.WebServiceException: javax.xml.bind.JAXBException: au.com.mycompany.policyinquiry.retrieveinsurancepolicydetails.v1.RetrieveInsurancePolicyDetailsResp 对此上下文未知
    在 org.apache.axis2.jaxws.ExceptionFactory.createWebServiceException(ExceptionFactory.java:175)
    在 org.apache.axis2.jaxws.ExceptionFactory.makeWebServiceException(ExceptionFactory.java:70)
    在 org.apache.axis2.jaxws.ExceptionFactory.makeWebServiceException(ExceptionFactory.java:128)
    在 org.apache.axis2.jaxws.marshaller.impl.alt.DocLitBareMinimalMethodMarshaller.demarshalResponse(DocLitBareMinimalMethodMarshaller.java:158)
    在 org.apache.axis2.jaxws.client.proxy.JAXWSProxyHandler.createResponse(JAXWSProxyHandler.java:499)
    在 org.apache.axis2.jaxws.client.proxy.JAXWSProxyHandler.invokeSEIMethod(JAXWSProxyHandler.java:377)
    在 org.apache.axis2.jaxws.client.proxy.JAXWSProxyHandler.invoke(JAXWSProxyHandler.java:185)
    在 $Proxy80.retrieveInsurancePolicyDetails(未知来源)

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

    当 JAX-WS Web 服务引擎接收到消息时,它使用
    JAXB 引擎将消息转换为 java bean。
    该消息表明转换 xml 时发生故障
    进入一个类型的对象
    com.somecom.lib.business.xml.ComIdentifierXml。失败
    表示 JAXB 引擎未使用
    有关此用户类别的信息。
    .
    在这个用例中,类
    com.somecom.lib.business.xml.ComIdentifierXml 被打包在一个
    EAR 级别的 JAR。如果
    类被打包在一个位于 WAR 模块的 JAR 中
    WEB-INF/lib 目录。
SOLUTION:

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

调用 web 服务的客户端使用纯 JAVA,不依赖外部库 JAX-WS RI 2.1.6

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

就是这样

干杯亚历克斯:)

于 2013-02-13T06:12:24.103 回答