1

http://docs.oracle.com/javaee/5/api/javax/xml/ws/handler/soap/SOAPHandler.html

handleMessage(SOAPMessageContext)インバウンドコールを および アウトバウンドに関連付けるにはどうすればよいですかhandleMessage(SOAPMessageContext)

いくつか試してみましたが、Weblogic はコンテキスト オブジェクトを再利用しないため、参照チェックは機能しません。リクエストを明確に示すプロパティが見つからないため、リクエストとレスポンスの間にリンクを作成できないようです。

あるいは、将来のデバッグ目的でデータベースにダンプできるように、問題のある Web ロジックでリクエストとレスポンスを取得し、関連付けるより良い方法があります。

4

2 に答える 2

0

これは JAX-WS のすべての実装で機能するとは限りませんが、weblogic では確実に機能します。

私がしたこと

public final boolean handleMessage(SOAPMessageContext context) {
    // Using `Object` type as we don't have any need to import servlet libraries into a JAX-WS library
    Object o = context.get(MessageContext.SERVLET_REQUEST);
    // o will hold a reference to the request 
    // if inbound.o == outbound.o the request objects are identical and therefor we can associate them.
    return true;
}

これが他のコンテナーで機能しない理由はわかりませんが、この方法を使用する前に再確認してください。

于 2013-02-11T22:52:53.973 に答える
0

これには定型コードが少し必要ですが、アプリ サーバーには依存しません。

AttachAttributesFilter は、startTime と UUID を属性に追加します。これらの属性は、受信および送信メッセージの LogSoapHandler で読み取られます。

ログを単純に検索すると、特定の UUID の入力と出力が表示されます。

@WebFilter("/yourwebservice")
public class AttachAttributesFilter implements Filter {

    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        request.setAttribute("STARTTIME", System.currentTimeMillis());
        request.setAttribute("UUID",java.util.UUID.randomUUID().toString());
        chain.doFilter(request, response);
    }

}

次に、LogSoapHander で属性を使用します

public class LogSoapHandler implements
        javax.xml.ws.handler.soap.SOAPHandler<SOAPMessageContext> {

    public boolean handleMessage(SOAPMessageContext messagecontext) {
        Boolean outbound = (Boolean) messagecontext.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
        String messageID = (String) httpSR.getAttribute("UUID");
        Object startTime = httpSR.getAttribute("STARTTIME");
        try {
            final SOAPMessage message = messagecontext.getMessage();
            String encoding = getMessageEncoding(message);
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            boolean fault = (message.getSOAPBody().hasFault());

            message.writeTo(baos);
            String body = (baos.toString(encoding));
            log.info(outbound+"|"+messageID+"|"+startTime+"|"+System.currentTimeMillis()+"|"+body+"|"+fault));

        } catch (SOAPException | IOException ex) {
            //handle your error
        }
        return true;
    }
    private String getMessageEncoding(SOAPMessage msg) throws SOAPException {
        String encoding = "utf-8";
        if (msg.getProperty(SOAPMessage.CHARACTER_SET_ENCODING) != null) {
            encoding = msg.getProperty(SOAPMessage.CHARACTER_SET_ENCODING)
                    .toString();
        }
        return encoding;
    }

HandlerChain ボイダー プレートを完成させるには、次のようにします。

@HandlerChain(file="loghandler.xml")
public class MyWSDL {
..
}

loghandler.xml :

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<javaee:handler-chains 
    xmlns:javaee="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <javaee:handler-chain>
        <javaee:handler>
            <javaee:handler-class>xxx.LogSoapHandler</javaee:handler-class>
        </javaee:handler>
    </javaee:handler-chain>
</javaee:handler-chains>
于 2016-01-07T07:43:58.393 に答える