2016-11-02 168 views
5

我正在开发一个已经实现基于metro的web服务客户端的项目。现在,我需要为其他服务添加另一个客户端。我实现了新的客户端,但是现在它有标题时会引发异常(需要标题)。如果我删除所有地铁罐,这个新客户工作正常,但显然我的地铁客户端失败。我需要关于可能的选项,解决方法或解决方案的指导。发送soap请求时的ClassCastException

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 jars的现有web服务客户端,我们使用连接器(如其实际包括所有与城域有关的类)的连接器连接到它们的服务器(我认为是非常奇怪的)。如果我从连接器移动任何东西,它将使支持协议无效。所以我不想移除地铁罐,而是寻找替代方法来适应它。

+0

如何实现自定义SoapHandler/Interceptor,您可能可以自己编组/解组头文件? – Mechkov

+1

查看'Headers'方法,如getHeaders()... – Mechkov

+0

https://docs.oracle.com/cd/E13222_01/wls/docs103/webserv_adv/handlers.html – Mechkov

回答

1

看起来很清楚,发生了什么事情是在第三方jar中存在地铁库的冲突版本,而不是您尝试使用的新城域库。

我的第一个想法是,你有任何控制类路径的顺序?你可以把你自己的地铁罐放到类路径的末端,看看这是否有所作为?

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

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

您也可以尝试调查支持重新打包库的Maven shade plugin,以便它们不会与其他版本发生冲突,尽管我不确定它如何与预编译的二进制文件一起工作 - 特别是所涉及的复杂性在JAX-WS软件包中...

+1

我确实拥有对类路径排序的控制权,并且已经测试过将它放在最后的顺序中,但没有任何区别。在单独的VM中运行并不理想。 “根据地铁库实现你自己的接口”是可能的选择,但必须看到它有多可行。我确实有版本信息。感谢您的输入 – Jimmy