发送soap请求时发生ClassCastException

时间:2016-11-02 15:22:14

标签: java web-services jax-ws soap-client java-metro-framework

我正在开发一个已经实现基于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)

我发现类似问题的问题很少,例如here,但他们最终都建议删除不适合我的标题。

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

1 个答案:

答案 0 :(得分:1)

似乎相当清楚的是,正在发生的事情是,第三方jar中的地铁库存在冲突版本,与您尝试使用的新地铁库相比。

我的第一个想法是,您是否可以控制类路径的排序?你能把自己的地铁罐放到类路径的两端,看看是否有所作为?

那么也许最好尝试在第三方库中包含的地铁库中实现自己的接口?我不确定您是否可以使用这种版本信息,但大多数现代IDE应该能够为您反编译第三方jar中的类。如果我在你的情况下,那将是我会尝试的第一件事,因为它有“最不活跃的部分”并使用已经可用的依赖项。

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

您也可以尝试调查支持重新打包库的Maven shade plugin,以便它们不与其他版本冲突,但我不确定它与预编译二进制文件的效果如何 - 特别是那种复杂性这涉及到JAX-WS包......