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

Java 使用JAX-RS resteasy和ContainerRequestFilter/ContainerResponseFilter记录请求,java,logging,jax-rs,resteasy,Java,Logging,Jax Rs,Resteasy,我想记录整个请求和响应主体。为了记录日志,jax-rs具有过滤器 public class ResponseLoggingFilter implements ContainerRequestFilter, ContainerResponseFilter { public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOExcepti

我想记录整个请求和响应主体。为了记录日志,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 {
        ...     
    }
  • 要将流返回到主代码,请使用
    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注释添加请求正文和响应正文之间的链接示例,来自:


    1.在ContainerResponseFilter requestContext.getEntityStream()中,它始终为空。2.很有效,谢谢!1.您可以执行其他操作,如requestContext.getHeaderString(“访问控制请求标头”)或requestContext.getProperty(“随机令牌”)也可以,但响应正文为空,我看不到将请求正文从ContainerRequestFilter链接到ContainerResponseFilter中的响应正文的解决方案,有关如何记录请求/响应的信息,请参见
    org.glassfish.jersey.logging.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());