2016-11-02 11 views
5

이미 구현 된 metro 기반 웹 서비스 클라이언트가있는 프로젝트에서 작업하고 있습니다. 이제 다른 서비스를 위해 다른 클라이언트를 추가해야했습니다. 새 클라이언트를 구현했지만 이제는 헤더가있을 때 예외가 발생합니다 (헤더가 필요함). 모든 메트로 항아리를 제거하면이 새로운 클라이언트는 정상적으로 작동하지만 분명히 내 메트로 클라이언트는 실패합니다. 가능한 옵션, 해결 방법 또는 해결 방법에 대한 지침이 필요합니다. 비누 요청을 보내는 동안 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 같은 비슷한 문제를 가진 몇 가지 질문을 찾았지만, 그들은 모두 나를 위해 옵션을하지 않은 헤더를 제거하기 위해 제안 끝낸다.

추신 : 메트로 항아리를 사용하는 기존 웹 서비스 클라이언트의 경우 서버 연결자가 서버에 연결하기 위해 클라이언트 (실제로는 모든 메트로 관련 클래스를 포함하는 항아리)와 같은 커넥터를 사용합니다 매우 이상하다). 커넥터에서 아무 것도 움직이면 지원 계약이 무효화됩니다. 따라서 나는 지하철 항아리를 제거하지 않고 대신 그것을 수용 할 대체 방법을 찾는다.

+0

헤더를 직접 마샬링/언 마샬링 할 수있는 사용자 정의 SoapHandler/Interceptor를 구현하는 방법은 무엇입니까? – Mechkov

+1

getHeaders()와 같은 'Headers'메소드를 살펴보십시오. – Mechkov

+0

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

답변

1

무슨 일이 일어나고 있는지는 사용하려는 새로운 메트로 라이브러리와 비교하여 제 3 자 항아리에 메트로 라이브러리의 버전이 충돌하고 있음이 분명합니다.

제 생각에는 클래스 패스의 순서를 제어 할 수 있습니까? 그 차이가 있는지 확인하기 위해 클래스 패스 끝 부분에 자신의 지하철 항아리를 넣을 수 있습니까?

아마도 제 자체 라이브러리에 포함 된 메트로 라이브러리 인의 측면에서 자신의 인터페이스 을 구현하는 것이 가장 좋을 수도 있습니다. 이런 종류의 버전 정보를 사용할 수 있을지 모르겠지만 가장 현대적인 IDE는 써드 파티 병의 클래스를 디 컴파일 할 수 있어야합니다. 귀하의 상황에 있다면, 내가 가장 먼저 시도 할 부분은 "최소 이동 부품"이며 이미 사용 가능한 종속성을 사용합니다.

또 다른 옵션은 하나 또는 다른 클라이언트를 별도의 VM에서 실행하고 기본 RMI 인터페이스를 통해 액세스하는 것입니다. 내가 알지 못하는 이상.

라이브러리의 재 패키징을 지원하는 라이브러리를 지원하는 조사를 시도해 볼 수도 있습니다. 그래도 미리 컴파일 된 바이너리, 예를 들어 복잡성과 관련하여 잘 작동하는지 잘 모르겠지만 다른 버전과 충돌하지 않습니다. JAX-WS 패키지에서 ...

+1

클래스 경로 순서를 제어 할 수 있고 이미 순서대로 테스트했으나 차이점은 없습니다. 별도의 VM으로 실행하는 것이 이상적이지 않습니다. '메트로 라이브러리 측면에서 자신 만의 인터페이스를 구현할 수 있습니다. '가능한 옵션이지만, 얼마나 실현 가능한지 알아야합니다. 나는 버전 정보를 가지고있다. 입력 해 주셔서 감사합니다. – Jimmy