使用JAX-RS resteasy和ContainerRequestFilter / ContainerResponseFilter记录请求
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用JAX-RS resteasy和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 {
...
}
- 要将流返回到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());
以上是关于使用JAX-RS resteasy和ContainerRequestFilter / ContainerResponseFilter记录请求的主要内容,如果未能解决你的问题,请参考以下文章
使用 JAX-RS/RESTEasy 实现 CORS 的 Ajax 请求
JAX-RS + JBoss 7.1.1 + RESTEasy:使用 CDI 的 NullPointException
JAX-RS (Resteasy 3.5.0.Final) + Wildfly 12 + Java 9 + maven = 404 未找到,但 JAX-RS (Resteasy 3.5.0.Final
Spring-boot - 如何同时使用 Resteasy JAX-RS 和 Spring MVC 控制器