【问题标题】:Jersey JAX-RS: extend logging over resource-class dispatchingJersey JAX-RS:通过资源类调度扩展日志记录
【发布时间】:2019-12-07 06:44:35
【问题描述】:

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

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

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

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

这可能吗?

【问题讨论】:

    标签: jersey jax-rs


    【解决方案1】:

    您可以通过使用预匹配过滤器来实现。

    预匹配过滤器是在 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());
        }
    }
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-18
      • 1970-01-01
      • 2019-01-08
      • 1970-01-01
      • 2015-02-07
      • 2014-12-18
      • 2011-09-28
      相关资源
      最近更新 更多