2011-10-21 5 views
2

JAXWS 클라이언트를 설정하고 SoapHandler 구현을 Binding handlerChain에 추가했습니다. 이 모든 것이 원시 서비스 응답을 볼 때 실행되지 않을 때 볼 수 있기를 바랍니다.잘못된 응답의 jaxws 핸들러 동작

모든 것이 괜찮 으면 내 handler.handleMessage()가 요청에 대해 한 번, 응답에 대해 두 번 호출됩니다.

하지만 서비스의 응답이 왜곡 된 XML이거나 나빠질 경우 handler.handleFault가 호출되기를 기대했지만 아무 일도 일어나지 않았을 것입니다. 여기

이 경우 관련 스택 트레이스의 일부입니다

com.sun.xml.internal.ws.streaming.XMLStreamReaderException: XML reader error: javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,1] 
Message: Premature end of file. 
    com.sun.xml.internal.ws.streaming.XMLStreamReaderUtil.wrapException(XMLStreamReaderUtil.java:256) 
    com.sun.xml.internal.ws.streaming.XMLStreamReaderUtil.next(XMLStreamReaderUtil.java:84) 
    com.sun.xml.internal.ws.streaming.XMLStreamReaderUtil.nextContent(XMLStreamReaderUtil.java:99) 
    com.sun.xml.internal.ws.streaming.XMLStreamReaderUtil.nextElementContent(XMLStreamReaderUtil.java:89) 
    com.sun.xml.internal.ws.encoding.StreamSOAPCodec.decode(StreamSOAPCodec.java:164) 
    com.sun.xml.internal.ws.encoding.StreamSOAPCodec.decode(StreamSOAPCodec.java:292) 
    com.sun.xml.internal.ws.encoding.StreamSOAPCodec.decode(StreamSOAPCodec.java:118) 
    com.sun.xml.internal.ws.encoding.SOAPBindingCodec.decode(SOAPBindingCodec.java:278) 
    com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.process(HttpTransportPipe.java:180) 
    com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.processRequest(HttpTransportPipe.java:83) 
    com.sun.xml.internal.ws.transport.DeferredTransportPipe.processRequest(DeferredTransportPipe.java:105) 
    com.sun.xml.internal.ws.api.pipe.Fiber.__doRun(Fiber.java:587) 
    com.sun.xml.internal.ws.api.pipe.Fiber._doRun(Fiber.java:546) 
    com.sun.xml.internal.ws.api.pipe.Fiber.doRun(Fiber.java:531) 
    com.sun.xml.internal.ws.api.pipe.Fiber.runSync(Fiber.java:428) 
    com.sun.xml.internal.ws.client.Stub.process(Stub.java:211) 
    com.sun.xml.internal.ws.client.sei.SEIStub.doProcess(SEIStub.java:124) 
    com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:98) 
    com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:78) 
    com.sun.xml.internal.ws.client.sei.SEIStub.invoke(SEIStub.java:107) 

내가 XML하고 내 처리기가 이미 컨텍스트에 좋은 XML을 기대할부터하지 않을 수 있습니다 교환 년대 RAW 데이터를 얻을 싶습니다. getMessage(). getSOAPPart() 이것이 내가가는 길이라고 생각하지 않습니다.

I 해요 SOAP 스택을 우회하고 데이터를 얻을 수 있지만,이 못생긴 작은 비트

정말 그 길을 갈해야 찾기 위해 HTTP를 통해 직접 내 요청을 실행하는 유혹?

답변

2

AFAIK, 프로그래밍 방식으로 JAX-WS 서비스의 원시 데이터 스트림을 가져올 방법이 없습니다.

데이터 스트림을 얻으려면 HTTP (또는 무엇이든) 프로토콜 파이프 라인에 일종의 처리기를 삽입해야합니다. JAX-WS 구현 및 버전에 따라이를 수행 할 수있는 방법이 있지만 JAX-WS 표준의 일부는 존재하지 않습니다. (다시, AFAIK ..)

문제를 해결할 필요가 있고 실제로 HTTP 파이프 라인에서 요청 및 응답을 기록하려는 경우이 시스템 속성을 사용하여 HTTP 전송 파이프가 모든 것을 기록하도록 할 수 있습니다

+0

또한 문제를 해결하는 좋은 방법이기도합니다. 코드가 전송하는 요청을 정확하게 다시 작성할 수 있다고 가정합니다. 당신의 코드가 어딘가에서 실제로 생성되는 로그라면 앱의 잘못된 입력으로 인한 문제를 재현하는 데 어려움을 겪을 것입니다. –

+0

원격 엔드가 제대로 작동하는지 쉽게 확인할 수있는 '기본 쿼리'가 있기 때문에 제 경우에는 작동합니다. – user691154

+0

내부 JAX-WS, 즉 rt.jar의 JRE와 함께 제공된 JAX-WS를 사용하는 경우 com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.dump = true를 사용해야합니다 (추가 'internal') (이 질문에 대한 답변에서) (http://stackoverflow.com/questions/5350476/tracing-xml-request-responses-with-jax-ws-when-error-cuurs). – Hok