jersey - Jersey JAX-RS:通过资源类调度扩展日志记录
问题描述
我正在将 Jersey JAX-RS 用于 REST 服务。我在我的程序中使用 GrizzlyHttp 在 SE-Deployment 中运行它。
我还注册了一个记录器,可以打印出 HTTP 请求和响应。
我缺少的是在 HTTP 服务器和资源类之间“记录”。
如果没有路径匹配或路径匹配但参数不匹配或类似情况,我想查看日志条目。今天我需要检查我的注释并将其与记录的 HTTP 参数进行比较。更多的日志记录会有所帮助。
那可能吗?
解决方案
您可以通过使用预匹配过滤器来实现它。
预匹配过滤器是在 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());
}
}
推荐阅读
- python - 如何在破折号下拉组件中添加全选选项?
- node.js - 节点服务器和base64
- python - python中的修补和取消修补对象方法
- java - 这个程序如何逐步计算两个区间之间的 Armstrong 数?
- r - 自定义函数不适用于名为“x”的列,除非在 summarise() dplyr R 中由 .$x 指定
- arrays - 如何执行条件推送到阵列(在 Pine 脚本上)?
- javascript - not able to add one string and file to FormData in JS
- python - “client = commands.Bot(command_prefix = '.')” “commands” 表示“未定义”
- java - Maven 模块在 IntelliJ 中找不到依赖项
- java - java中的每月跟踪器