1

我们使用 JBoss 和 Resteasy 来实现 Web 服务,其中一个要求是我们在处理开始之前记录传递给 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-method 访问并提取满足您的日志记录要求所需的数据。

于 2012-08-22T11:27:48.697 回答