我想在@ServerRequestFilter过滤器中打印post请求主体的json日志
@ServerRequestFilter
public void requestFilter(ContainerRequestContext requestContext) throws IOException {
InputStream entityStream = requestContext.getEntityStream();
byte[] data = new byte[1024];
int r;
ByteArrayOutputStream out = new ByteArrayOutputStream();
while ((r = entityStream.read(data)) > 0) {
out.write(data, 0, r);
}
log.info(StrUtil.format("body->[{}]", out.toString(StandardCharsets.UTF_8)));
requestContext.setEntityStream(new ByteArrayInputStream(out.toByteArray()));
}
但我发现,无论我对实体流做什么,都会触发
java.io.IOException: Attempting a blocking read on io thread
at org.jboss.resteasy.reactive.server.vertx.VertxInputStream$VertxBlockingInput.readBlocking
原因似乎是InputStream是一个阻塞IO,但VertX需要一个非阻塞IO
因此,我想问如何以非阻塞的方式读取过滤器中的请求正文
请不要让我在拦截器中打印请求日志,我知道我可以做到,但我仍然想知道如何解决这个问题
如果您真的想这样做,您应该在扩展javax.ws.rs.core.Application
的类上添加@Blocking
,如下所示:
@Blocking
public class MyApplication extends Application {
}