我正在配置自定义错误处理,以便将每个错误的请求记录到我的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
从请求中读取,但目前已关闭。另一个问题建议注入a RequestContext
并将其设置为on Controller
。这在Bad Request
方案中不起作用,因为它不会执行控制器。同样,在每个控制器中进行设置也没有太大意义。
提前致谢,
编辑
正如@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
它工作正常,我看到了机身。但是当我尝试@ExceptionHandler
使用时,ContentCachingRequestWrapper
我得到一个空字符串,
正如@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
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句