gpt4 book ai didi

java - 在异常映射器中检索请求正文

转载 作者:太空狗 更新时间:2023-10-29 22:56:56 25 4
gpt4 key购买 nike

我正在尝试在 JAX-RS ExceptionMapper 中检索请求的主体。到目前为止,这是我的代码:

@Provider @Componenet
public class BaseExceptionMapper implements ExceptionMapper<Exception> {

@Context private HttpServletRequest request;

@Override
public Response toResponse(Exception ex) {

// Trying to retrieve request body for logging throws an error
String requestBody = IOUtils.toString(request.getInputStream());

}

}

所以我的困境是我无法获取日志记录的请求主体,因为 servlet API 不允许您为一个请求多次调用 request.getInputStream()/request.getReader()(显然 JAX-RS 是调用它来解析请求)。有谁知道是否有办法做我想做的事?

最佳答案

这个问题有点老了,但答案仍然可以帮助其他人。我的例子也依赖于 Commons-Io。

您可以创建一个 ContainerRequestFilter 并使用 TeeInputStream 来代理/复制原始 InputStream:

@Provider
@Priority(Priorities.ENTITY_CODER)
public class CustomRequestWrapperFilter implements ContainerRequestFilter {

@Override
public void filter(ContainerRequestContext requestContext)
throws IOException {
ByteArrayOutputStream proxyOutputStream = new ByteArrayOutputStream();
requestContext.setEntityStream(new TeeInputStream(requestContext.getEntityStream(), proxyOutputStream));
requestContext.setProperty("ENTITY_STREAM_COPY", proxyOutputStream);
}

}

并在 ExceptionMapper 中使用 @Inject 和 javax.inject.Provider 来注入(inject) ContainerRequest。

ExceptionMapper 看起来像这样:

@Provider
public class BaseExceptionMapper implements ExceptionMapper<Exception> {

@Inject
private javax.inject.Provider<ContainerRequest> containerRequestProvider;

@Override
public Response toResponse(Exception exception) {
ByteArrayOutputStream bos = (ByteArrayOutputStream) containerRequestProvider
.get().getProperty("ENTITY_STREAM_COPY");
String requestBody = bos.toString();
...
}

}

当我还使用了 @Component 注释时,我的 ExceptionMapper 没有被使用。我认为@Provider 就足够了。

关于java - 在异常映射器中检索请求正文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8095631/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com