繁体   English   中英

使用JAX-RS resteasy和ContainerRequestFilter / ContainerResponseFilter记录请求

[英]Logging request with JAX-RS resteasy and ContainerRequestFilter/ContainerResponseFilter

我想记录整个请求和响应正文。 出于记录目的,jax-rs具有过滤器。

public class ResponseLoggingFilter implements ContainerRequestFilter, ContainerResponseFilter {
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException { 
        System.out.println(IOUtils.toString(requestContext.getEntityStream(), "UTF-8")); // It's always empty string
        System.out.println(responseContext.getEntity().toString());  // Here is actual response. It's OK
    }
    public void filter(ContainerRequestContext requestContext) throws IOException { 
        System.out.println(IOUtils.toString(requestContext.getEntityStream(), "UTF-8")); // Here is actual response. But this request is empty in main code. 
    }
}

在响应筛选器中,我无法获取请求正文。 在请求过滤器中,我得到它,但是:

  • 我无法获得请求正文和响应正文之间的链接。
  • 一旦从流中写入请求主体,就将此流设置为空,而我无法在主代码中获取它。

我正在使用resteasy 3.0.6。

1.要在请求和响应之间建立联系:

@Override
    public void filter(ContainerRequestContext paramContainerRequestContext, ContainerResponseContext paramContainerResponseContext) throws IOException {
        ...     
    }
  1. 要将流返回到Main代码,请使用setEntityStream将其写回:

     ByteArrayOutputStream out = new ByteArrayOutputStream(); InputStream in = requestContext.getEntityStream(); final StringBuilder b = new StringBuilder(); try { ReaderWriter.writeTo(in, out); byte[] requestEntity = out.toByteArray(); ... requestContext.setEntityStream(new ByteArrayInputStream(requestEntity)); 

编辑

使用@Moritz Becker添加来自ClientLoggingFilter的请求正文和响应正文之间的链接的注释示例:

 @Override public void filter(final ClientRequestContext requestContext, final ClientResponseContext responseContext) throws IOException { ... final Object requestId = requestContext.getProperty(LOGGING_ID_PROPERTY); final long id = requestId != null ? (Long) requestId : _id.incrementAndGet(); final StringBuilder b = new StringBuilder(); printResponseLine(b, "Client response received", id, responseContext.getStatus()); printPrefixedHeaders(b, id, RESPONSE_PREFIX, responseContext.getHeaders()); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM