您可以创建过滤器并将其轻松绑定到需要记录的端点,从而使端点保持精简并专注于业务逻辑。
定义名称绑定注释
要将过滤器绑定到REST端点,JAX-
RS提供了元注释
@NameBinding,它可以按以下方式使用:
@NameBinding@Retention(RUNTIME)@Target({TYPE, METHOD})public @interface Logged { }记录HTTP请求
该
@Logged注释将被用来装饰一个过滤器类,它实现
ContainerRequestFilter,让您在处理请求:
@Logged@Providerpublic 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请求信息。
以下是
ContainerRequestContextAPI中从HTTP请求获取信息的方法,这些信息可能对您的日志有用:
ContainerRequestContext#getMethod()
:从请求中获取HTTP方法。ContainerRequestContext#getUriInfo()
:从HTTP请求获取URI信息。ContainerRequestContext#getHeaders()
:从HTTP请求获取标头。ContainerRequestContext#getMediaType()
:获取实体的媒体类型。ContainerRequestContext#getEntityStream()
:获取实体输入流。
记录HTTP响应
要记录响应,请考虑实施
ContainerResponseFilter:
@Logged@Providerpublic 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响应信息。
以下是
ContainerResponseContextAPI的一些方法,这些方法可从HTTP响应中获取对您的日志有用的信息:
ContainerResponseContext#getStatus()
:从HTTP响应中获取状态代码。ContainerResponseContext#getHeaders()
:从HTTP响应中获取标头。ContainerResponseContext#getEntityStream()
:获取实体输出流。
将过滤器绑定到端点
要将过滤器绑定到端点方法或类,请使用
@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接口中可用的方法外,您还可以
ResourceInfo使用
@Context以下方法插入过滤器:
@ContextResourceInfo resourceInfo;
它可以用来获取
Method和
Class匹配请求的URL其中:
Class<?> resourceClass = resourceInfo.getResourceClass();Method resourceMethod = resourceInfo.getResourceMethod();
HttpServletRequest并且
HttpServletResponse也可用于注射:
@ContextHttpServletRequest httpServletRequest;@ContextHttpServletResponse httpServletResponse;



