gpt4 book ai didi

java - 在 @RestControllerAdvise 上获取请求正文

转载 作者:太空宇宙 更新时间:2023-11-04 09:06:04 25 4
gpt4 key购买 nike

我正在配置自定义错误处理,以便将每个错误请求记录到我的 API。在我的场景中,了解请求中传递的有效负载非常重要,这样我就可以根据需要修复/测试/重新处理它。

我已经构建了一个简单的@RestControllerAdvise,但我很难从中获取请求正文:

@RestControllerAdvice
class ExceptionHandler {

companion object {
private val logger = getLogger()
}

@ExceptionHandler
@ResponseStatus(HttpStatus.BAD_REQUEST)
fun badRequest(e: Exception, request: HttpServletRequest): Exception {
logger.error("Received a bad request with body: ${request.getBodyPlease()}", e) // Note getBodyPlease() is not a real method
return e
}
}

我尝试从请求中读取InputStream,但此时它已经关闭。 Another question建议注入(inject) RequestContext 并将其设置在 Controller 上。这在 Bad Request 场景中不起作用,因为它不会执行 Controller 。而且在每个 Controller 中设置它也没有多大意义。

提前致谢,

编辑

正如 @BeUndead 所建议的,我尝试实现一个过滤器来包装请求:

@Component
class RequestWrapperFilter : Filter {
override fun doFilter(req: ServletRequest, res: ServletResponse, chain: FilterChain) {
val reqWrapper = ContentCachingRequestWrapper(req as HttpServletRequest)
chain.doFilter(reqWrapper, res)
}
}

然后我尝试获取像 request.reader.lines().collect(Collectors.joining()) 这样的正文。当我尝试使用 ServletRequest 的过滤器时,它工作正常,我看到了主体。但是当我尝试使用 @ExceptionHandlerContentCachingRequestWrapper 时,我得到一个空字符串,

最佳答案

按照@BeUndead的建议,我实现了一个过滤器来将我的请求包装在ContentCachingRequestWrapper中:

@Component
class RequestWrapperFilter : Filter {
override fun doFilter(req: ServletRequest, res: ServletResponse, chain: FilterChain) {
val reqWrapper = ContentCachingRequestWrapper(req as HttpServletRequest)
chain.doFilter(reqWrapper, res)
}
}

然后我就可以从 contentAsByteArrayProperty 中多次准备主体:

@RestControllerAdvice
class ExceptionHandler {

companion object {
private val logger = getLogger()
}

@ExceptionHandler
@ResponseStatus(HttpStatus.BAD_REQUEST)
fun badRequest(e: Exception, request: HttpServletRequest): Exception {
val body = (request as ContentCachingRequestWrapper).contentAsByteArray.toString(Charsets.UTF_8)
logger.error("Received a bad request with body: $body", e)
return e
}
}

关于java - 在 @RestControllerAdvise 上获取请求正文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60211209/

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