2017-08-28 6 views
0

私は、スタンドアロンサーバーアプリケーションでjax-wsサービスを公開しています。このサービスは、この質問への答えに助言したよう文書SOAPHandlerを介してログが有効になっている場合のmtomサービスのJAX-WSフォールトの変更

を受け取るためにMTOMを使用しています。

私は以下のようにサービスのログSOAPメッセージのハンドラを使用し

Tracing XML request/responses with JAX-WS

public boolean handleMessage(SOAPMessageContext smc){ 
    performLoggingActions(smc); 
    return true; 
} 

ロガー方式は以下の通りです。

private void performLoggingActions(SOAPMessageContext smc) { 
    ByteArrayOutputStream bout = null; 
    try { 
     Boolean isOutBound = (Boolean) smc.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY); 
     SOAPMessage message = smc.getMessage(); 
     //More stuff 
    } catch (Exception e) { 
     logger.error(String.format("Error in logSoapMessage! Error: %s ", e.getMessage()), e); 
    } finally { 
     IOUtils.closeQuietly(bout); 
    } 

}

クライアントが有効な要求を送信すると、ログに問題はありません。すべてが期待通りに記録されます。

SOAP UIを介して要求に無効なコンテンツIDを送信すると、SOAPMessageメッセージ= smc.getMessage();の行が失敗します。そして、私は以下のエラーを持っている:

Error in logSoapMessage! Error: No such MIME Part: Part=5 
java.lang.IllegalStateException: No such MIME Part: Part=5 
    at com.sun.xml.internal.org.jvnet.mimepull.DataHead.read(DataHead.java:138) 
    at com.sun.xml.internal.org.jvnet.mimepull.MIMEPart.read(MIMEPart.java:85) 

問題は、これが発生したときに、メッセージがサービスレベルにpropogateしないとサービスがフォールト以下でクライアントに応答し、次のとおりです。

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> 
    <S:Body> 
     <S:Fault xmlns:ns4="http://www.w3.org/2003/05/soap-envelope"> 
     <faultcode>S:Server</faultcode> 
     <faultstring>unexpected XML tag. expected: somenamespace but found: {http://www.w3.org/2004/08/xop/include}Include</faultstring> 
     </S:Fault> 
    </S:Body> 
</S:Envelope> 

ときI soapのロギングを無効にしてフォールト要求を送信すると、メッセージはサービスレベル、@WebServiceアノテートされたクラスに伝播され、mtomコンテンツを読み込もうとするときに同様のexpectionを受け取ります。 しかし、その場合にはエラーがフォルト文字列として応答に反映されます。

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> 
    <S:Body> 
     <S:Fault xmlns:ns4="http://www.w3.org/2003/05/soap-envelope"> 
     <faultcode>S:Server</faultcode> 
     <faultstring>No such MIME Part: Part=5</faultstring> 
     </S:Fault> 
    </S:Body> 
</S:Envelope> 

は、私は関係なく、ログハンドラの存在の同じ障害を期待します。

ご覧のとおり、すべての例外をロギングハンドラで捕捉していますが、サービス応答はロギングハンドラの存在に応じて変化します。

私は何か間違っていますか?私の要件は、ロギングハンドラの有無にかかわらず同じフォールトを取得しています。

よろしく

EDIT:エラーの全体のスタックトレースが追加さ:

Error in logSoapMessage! Error: No such MIME Part: Part=5 
java.lang.IllegalStateException: No such MIME Part: Part=5 
    at com.sun.xml.internal.org.jvnet.mimepull.DataHead.read(DataHead.java:138) 
    at com.sun.xml.internal.org.jvnet.mimepull.MIMEPart.read(MIMEPart.java:85) 
    at com.sun.xml.internal.ws.encoding.MIMEPartStreamingDataHandler$StreamingDataSource.getInputStream(MIMEPartStreamingDataHandler.java:98) 
    at com.sun.xml.internal.org.jvnet.staxex.Base64Data.get(Base64Data.java:315) 
    at com.sun.xml.internal.org.jvnet.staxex.Base64Data.length(Base64Data.java:357) 
    at com.sun.xml.internal.ws.encoding.MtomCodec$MtomXMLStreamReaderEx.getTextCharacters(MtomCodec.java:533) 
    at com.sun.istack.internal.XMLStreamReaderToContentHandler.handleCharacters(XMLStreamReaderToContentHandler.java:244) 
    at com.sun.istack.internal.XMLStreamReaderToContentHandler.bridge(XMLStreamReaderToContentHandler.java:155) 
    at com.sun.xml.internal.ws.message.stream.StreamMessage.writePayloadTo(StreamMessage.java:375) 
    at com.sun.xml.internal.ws.message.stream.StreamMessage.writeTo(StreamMessage.java:460) 
    at com.sun.xml.internal.ws.message.AbstractMessageImpl.readAsSOAPMessage(AbstractMessageImpl.java:196) 
    at com.sun.xml.internal.ws.handler.SOAPMessageContextImpl.getMessage(SOAPMessageContextImpl.java:82) 
    at com.ibtech.smg.esb.jaxws.handler.JAXWSSOAPLoggingHandler.performLoggingActions(JAXWSSOAPLoggingHandler.java:54) 
    at com.ibtech.smg.esb.jaxws.handler.JAXWSSOAPLoggingHandler.handleMessage(JAXWSSOAPLoggingHandler.java:36) 
    at com.ibtech.smg.esb.jaxws.handler.JAXWSSOAPLoggingHandler.handleMessage(JAXWSSOAPLoggingHandler.java:1) 
    at com.sun.xml.internal.ws.handler.HandlerProcessor.callHandleMessage(HandlerProcessor.java:295) 
    at com.sun.xml.internal.ws.handler.HandlerProcessor.callHandlersRequest(HandlerProcessor.java:138) 
    at com.sun.xml.internal.ws.handler.ServerSOAPHandlerTube.callHandlersOnRequest(ServerSOAPHandlerTube.java:136) 
    at com.sun.xml.internal.ws.handler.HandlerTube.processRequest(HandlerTube.java:118) 
    at com.sun.xml.internal.ws.api.pipe.Fiber.__doRun(Fiber.java:639) 
    at com.sun.xml.internal.ws.api.pipe.Fiber._doRun(Fiber.java:598) 
    at com.sun.xml.internal.ws.api.pipe.Fiber.doRun(Fiber.java:583) 
    at com.sun.xml.internal.ws.api.pipe.Fiber.runSync(Fiber.java:480) 
    at com.sun.xml.internal.ws.server.WSEndpointImpl$2.process(WSEndpointImpl.java:312) 
    at com.sun.xml.internal.ws.transport.http.HttpAdapter$HttpToolkit.handle(HttpAdapter.java:606) 
    at com.sun.xml.internal.ws.transport.http.HttpAdapter.handle(HttpAdapter.java:257) 
    at com.sun.xml.internal.ws.transport.http.server.WSHttpHandler.handleExchange(WSHttpHandler.java:108) 
    at com.sun.xml.internal.ws.transport.http.server.WSHttpHandler.handle(WSHttpHandler.java:93) 
    at com.sun.net.httpserver.Filter$Chain.doFilter(Filter.java:90) 
    at sun.net.httpserver.AuthFilter.doFilter(AuthFilter.java:96) 
    at com.sun.net.httpserver.Filter$Chain.doFilter(Filter.java:93) 
    at sun.net.httpserver.ServerImpl$Exchange$LinkHandler.handle(ServerImpl.java:690) 
    at com.sun.net.httpserver.Filter$Chain.doFilter(Filter.java:90) 
    at sun.net.httpserver.ServerImpl$Exchange.run(ServerImpl.java:662) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1157) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:627) 
    at java.lang.Thread.run(Thread.java:809) 

答えて

0

あなたのSOAPハンドラで全体のスタックトレースとコードを貼り付けてくださいもらえますか?この行はあなたのログに印刷されていますか?
logger.error(String.format("Error in logSoapMessage! Error: %s ", e.getMessage()), e);

+0

スタックトレース全体を追加しました。あなたがあなたが言及しているラインを見ることができるので、dが印刷されています。この例外は、SOAPMessageメッセージ= smc.getMessage();行から発生します。 – simpleusr

+0

catchブロックに 'throw e'を追加して参照してください。それは元の例外をクライアントに戻す必要があります。 – Gautam

+0

こんにちは、私はすでに、そのオプションを考えていますが、javax.xml.ws.handler.Handler インタフェースのpublic boolean handleMessage(Cコンテキスト)メソッドは、例外がスローされることを許可していません... – simpleusr

関連する問題