如何在quarkus框架中使用@ServerRequestFilter,该框架使用vert.x读取ContainerRe



我想在@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 {
}

相关内容

  • 没有找到相关文章

最新更新