我尝试使用ContainerResponseContext
的getEntityStream()
捕获响应实体流。下面是代码:
public String getResponseEntityStream(ContainerResponseContext context) throws IOException {
OutputStream originalStream = context.getEntityStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
context.setEntityStream(baos);
String body = baos.toString();
baos.writeTo(originalStream);
baos.close();
context.setEntityStream(originalStream);
return body;
}
我在下面的代码中调用上面的方法来获取整个响应流:
@Override
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext)
throws IOException {
StringBuilder sbResponse = new StringBuilder();
sbResponse.append(" - Response Entity Class: ").append(responseContext.getEntityClass())
.append(System.getProperty("line.separator"));
sbResponse.append(" - Response Entity Stream: ").append(getResponseEntityStream(responseContext))
.append(System.getProperty("line.separator"));
System.out.println("HTTP RESPONSE : " + "\n" + sbResponse.toString());
}
我的问题:
在上面的代码中,Response Entity Stream
总是空的。我只是试图读取整个响应实体流并打印它以显示原始流的样子,然后再对流进行一些处理。我在哪里犯了错误?提前感谢。
**UPDATE:**我可以使用WriterInterceptor
获取响应体。但是只有当有响应负载时才会调用WriterInterceptor
。我使用ContainerResponseFilter
是因为我想在没有负载的情况下读取响应详细信息。此外,Writer Interceptor不像ContainerResponseFilter
那样帮助getStatus()
和getStatusInfo()
。有没有方法可以将ContainerResponseFilter
和WriterInterceptor
的数据组合在一个字符串中并在日志中打印整个响应。可能是使用Thread Local?
2条答案
按热度按时间t8e9dugd1#
ContainerResponseContext
有两个方法在这里被混淆:OutputStream
。实体在编写器拦截器阶段写入。OutputStream
可以由用户提供的OutputStream
进行修饰,该OutputStream
可以执行所需的操作,例如,记录信息并将数据写入原始流。这个新的修饰器OutputStream
可以通过ContainerResponseContext#setEntityStream()注册。Jersey附带LoggingFeature /ServerLoggingFilter/LoggingInterceptor。它们一起完成了这个日志记录,过滤器装饰了原始的
OutputStream
,它们记录了实体,头和其他与响应相关的信息。在这些Jersey类中,您可以看到如何使用ContainerRequestContext#setProperty()和WriterInterceptorContext#getProperty将信息从
Filter
传递到Interceptor
。bxjv4tth2#
我认为对
ContainerResponseContext#getEntityStream()
方法的用法有一个误解。人们不应该从OutputStream
读取。正如@jan-supol在他的回答中所说,例如,您可以使用记录器装饰
OutputStream
。但是,如果您仍然希望以现在的方式记录响应,则可以直接检索实体。
你写的代码:
我会这么做