Jersey JAX-RS:通过资源类调度扩展日志记录

问题描述 投票:1回答:1

我正在将Jersey JAX-RS用于REST服务。我在SE-Deployment中使用GrizzlyHttp在程序中运行它。

我还注册了一个记录器,该记录器打印出HTTP请求和响应。

我缺少的是在HTTP服务器和资源类之间“记录日志。

如果没有路径匹配或路径匹配但参数不匹配或类似情况,我想查看日志条目。今天,我需要检查我的注释并将其与记录的HTTP参数进行比较。多一点日志记录将很有帮助。

有可能吗?

jersey jax-rs
1个回答
1
投票

您可以使用pre-matching过滤器来实现。

预匹配过滤器是在JAR-RS运行时试图将请求与资源匹配之前被调用的过滤器。这种类型的过滤器使您可以记录请求的URI,即使它可能与您的任何资源都不匹配。您需要为带有@PreMatching注释的过滤器添加注释,而这是在资源匹配阶段之前调用过滤器所要做的全部工作。

注:如果希望在提供者扫描阶段可以通过JAX-RS运行时发现过滤器,则需要使用@Provider注释对其进行注释。或者,您可以在应用程序设置中手动注册它(就像我所做的那样,这就是为什么在下面的示例中,我没有使用@Provider注释过滤器)。

这是预匹配过滤器的一个非常简单的示例。

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerRequestFilter;
import javax.ws.rs.container.PreMatching;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.UriInfo;
import java.io.IOException;

@PreMatching
public class PreMatchingFilterExample implements ContainerRequestFilter {

    private final static Logger LOG = LogManager.getLogger(PreMatchingFilterExample.class);
    @Context
    UriInfo uriInfo;

    @Override
    public void filter(ContainerRequestContext requestContext) throws IOException {
        LOG.info("Resource not found: " + uriInfo.getAbsolutePath());
        LOG.info("Path params: " + uriInfo.getPathParameters());
        LOG.info("Query params: " + uriInfo.getQueryParameters());
    }
}

© www.soinside.com 2019 - 2024. All rights reserved.