您可以创建筛选器并轻松地将其绑定到需要记录的终端节点,从而使您的终端节点保持精益并专注于业务逻辑。
定义名称绑定批注
要将过滤器绑定到 REST 端点,JAX-RS 提供了元注释@NameBinding
,可以按如下方式使用它:
@NameBinding
@Retention(RUNTIME)
@Target({TYPE, METHOD})
public @interface Logged { }
记录 HTTP 请求
该注释将用于修饰一个过滤器类,该类实现 ContainerRequestFilter
,允许您处理请求:@Logged
@Logged
@Provider
public class RequestLoggingFilter implements ContainerRequestFilter {
@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
// Use the ContainerRequestContext to extract information from the HTTP request
// Information such as the URI, headers and HTTP entity are available
}
}
@Provider
注释标记了扩展接口的实现,JAX-RS 运行时在提供程序扫描阶段应可发现该接口。
ContainerRequestContext
可帮助您从 HTTP 请求中提取信息。
以下是 ContainerRequestContext
API 中的方法,用于从 HTTP 请求中获取对日志有用的信息:
记录 HTTP 响应
要记录响应,请考虑实现容器响应过滤器
:
@Logged
@Provider
public class ResponseLoggingFilter implements ContainerResponseFilter {
@Override
public void filter(ContainerRequestContext requestContext,
ContainerResponseContext responseContext) throws IOException {
// Use the ContainerRequestContext to extract information from the HTTP request
// Use the ContainerResponseContext to extract information from the HTTP response
}
}
ContainerResponseContext
可帮助您从 HTTP 响应中提取信息。
以下是 ContainerResponseContext
API 中的一些方法,用于从 HTTP 响应中获取对日志有用的信息:
将筛选器绑定到终结点
若要将筛选器绑定到终结点方法或类,请使用上面定义的批注对其进行批注。对于带注释的方法和/或类,将执行筛选器:@Logged
@Path("/")
public class MyEndpoint {
@GET
@Path("{id}")
@Produces("application/json")
public Response myMethod(@PathParam("id") Long id) {
// This method is not annotated with @Logged
// The logging filters won't be executed when invoking this method
...
}
@DELETE
@Logged
@Path("{id}")
@Produces("application/json")
public Response myLoggedMethod(@PathParam("id") Long id) {
// This method is annotated with @Logged
// The request logging filter will be executed before invoking this method
// The response logging filter will be executed before invoking this method
...
}
}
在上面的示例中,日志记录筛选器将仅执行 ,因为它用 注释。myLoggedMethod(Long)
@Logged
附加信息
除了 ContainerRequestContext
和 ContainerResponseFilter
接口中提供的方法之外,您还可以使用@Context
在筛选器中注入 ResourceInfo
:
@Context
ResourceInfo resourceInfo;
它可用于获取与请求的 URL 匹配的方法
和类
:
Class<?> resourceClass = resourceInfo.getResourceClass();
Method resourceMethod = resourceInfo.getResourceMethod();
HttpServletRequest
和HttpServletResponse
也可用于注入:
@Context
HttpServletRequest httpServletRequest;
@Context
HttpServletResponse httpServletResponse;
有关可以注入@Context
的类型,请参阅此答案。