发送soap请求时发生ClassCastException

Jim*_*mmy 6 java web-services java-metro-framework jax-ws soap-client

我正在开发一个已经metro基于Web服务客户端实现的项目.现在,我需要为不同的服务添加另一个客户端.我实现了新的客户端,但是现在它在有标题时抛出异常(需要标题).如果我删除所有地铁罐,这个新客户端工作正常,但显然我的城域客户端失败.我需要有关可能的选项,解决方法或解决方案的指导.

Caused by: javax.xml.ws.WebServiceException: java.lang.ClassCastException: com.sun.xml.ws.message.saaj.SAAJHeader cannot be cast to com.sun.xml.ws.security.opt.impl.outgoing.SecurityHeader
at com.sun.xml.wss.jaxws.impl.SecurityClientTube.processRequest(SecurityClientTube.java:250)
at com.sun.xml.ws.api.pipe.Fiber.__doRun(Fiber.java:961)
at com.sun.xml.ws.api.pipe.Fiber._doRun(Fiber.java:910)
at com.sun.xml.ws.api.pipe.Fiber.doRun(Fiber.java:873)
at com.sun.xml.ws.api.pipe.Fiber.runSync(Fiber.java:775)
at com.sun.xml.ws.client.Stub.process(Stub.java:429)
at com.sun.xml.ws.client.sei.SEIStub.doProcess(SEIStub.java:168)
at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:119)
at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:102)
at com.sun.xml.ws.client.sei.SEIStub.invoke(SEIStub.java:151)
at com.sun.proxy.$Proxy70.methodName(Unknown Source)
... 15 more

Caused by: java.lang.ClassCastException: com.sun.xml.ws.message.saaj.SAAJHeader cannot be cast to com.sun.xml.ws.security.opt.impl.outgoing.SecurityHeader
    at com.sun.xml.ws.security.opt.impl.JAXBFilterProcessingContext.setJAXWSMessage(JAXBFilterProcessingContext.java:166)
    at com.sun.xml.wss.jaxws.impl.SecurityTubeBase.secureOutboundMessage(SecurityTubeBase.java:381)
    at com.sun.xml.wss.jaxws.impl.SecurityClientTube.processClientRequestPacket(SecurityClientTube.java:323)
    at com.sun.xml.wss.jaxws.impl.SecurityClientTube.processRequest(SecurityClientTube.java:247)
Run Code Online (Sandbox Code Playgroud)

我发现这里有类似问题的问题很少,但他们最终都建议删除不适合我的标题.

PS:对于使用metro jar的现有webservice客户端,我们使用服务器方提供的连接器(如客户端(它实际上包括所有与地球相关的类)的连接器连接到他们的服务器(我认为这非常奇怪) .如果我从连接器移动任何东西,它将使支持协议无效.所以我不想删除地铁罐,而是找到适应它的替代方法.

rob*_*ert 1

很明显,发生的情况是第三方 jar 中的 Metro 库版本与您尝试使用的新 Metro 库版本存在冲突。

我的第一个想法是,您可以控制类路径的顺序吗?您能否将自己的 Metro jar 放在类路径的两端,看看是否有影响?

那么也许最好尝试根据第三方库中包含的 Metro 库来实现自己的界面?我不确定您是否可以获得此类版本信息,但大多数现代 IDE 应该能够为您反编译第三方 jar 中的类。如果我处于您的情况,这将是我会尝试的第一件事,因为它具有“最少移动的部分”并使用您已经可用的依赖项。

另一种选择是在单独的 VM 中运行一个或其他客户端,并通过基本 RMI 接口进行访问。我知道并不理想。

您也可以尝试研究Maven 阴影插件,它支持重新打包库,以便它们不会与其他版本发生冲突,尽管我不确定它与预编译的二进制文件的配合效果如何 - 特别是 JAX 中涉及的复杂性-WS 包...