1

JBoss と Resteasy を使用して Web サービスを実装しています。要件の 1 つは、処理を開始する前に、Web サービスに渡されたパラメーターと属性をログに記録することです。PreProcessInterceptor はこれに最適です。私はそれを機能させ、要求パラメーターを正常に記録していますが、情報の一部は属性として渡される予定であり、それらにアクセスする方法がわかりません。

以下は、リクエスト パラメータをログに記録するために使用するコードです。属性を取得する方法も教えてもらえますか?

@Provider
@ServerInterceptor
public class ParameterLoggingInterceptor implements PreProcessInterceptor {
    @Inject
    private Logger logger;

@Override
public ServerResponse preProcess(HttpRequest request, ResourceMethod method) throws UnauthorizedException {
    StringBuilder sb = new StringBuilder();
    MultivaluedMap<String, String> mMap = request.getUri().getQueryParameters();
    Set<String> keys = mMap.keySet();
    int mapSize = keys.size();
    if (mapSize > 0) {
        sb.append("Incoming parameters: ");
        int processedParams = 1; 
        for (String key : keys) {
            sb.append(key).append("=");
            sb.append(mMap.get(key));
            if (processedParams < mapSize) {
                sb.append(", ");
            }
            processedParams++;
        }
        logger.debug(sb.toString());
    }
    return null;
}

Eidenの回答に応じて、次を追加するように編集されました。

ありがとう、エイデン。試してみました。以下のようなことですか?もしそうなら、それはうまくいかないようです (もしそうでなければ、明確にしてください)。attributeName が提供するのは「org.jboss.weld.context.AbstractConversationContext」であり、attributeValue は同じです。これは、org.jboss.resteasy.spi.HttpRequest オブジェクトを使用したときに得た結果と同じです。

@Provider
@ServerInterceptor
public class ParameterLoggingInterceptor implements PreProcessInterceptor {
    @Context HttpServletRequest servletRequest;

    @Inject
    private Logger logger;

@Override
public ServerResponse preProcess(HttpRequest request, ResourceMethod method) throws UnauthorizedException {
    Enumeration<String> attributeNames = servletRequest.getAttributeNames();
    StringBuilder sb = new StringBuilder();
    while (attributeNames.hasMoreElements()) {
        String attributeName = (String) attributeNames.nextElement();
        String attributeValue = (String) servletRequest.getAttribute(attributeName);
        // Do something with attributeValue and attributeName
    }
}
4

1 に答える 1

4

RestEasy はHttpServletRequestをインターセプターに挿入できます。

@Provider
@ServerInterceptor
public class ParameterLoggingInterceptor implements PreProcessInterceptor {
    @javax.ws.rs.core.Context HttpServletRequest servletRequest;

}

HttpServletRequest次に、メソッドから直接アクセスしてpreProcess、ロギング要件を満たすために必要なデータを抽出できます。

于 2012-08-22T11:27:48.697 に答える