我正在配置一个自定义错误处理,以便将每个错误请求记录到我的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
但此时它已经关闭。另一个问题建议注射 RequestContext
把它打开 Controller
. 这在一个国家是行不通的 Bad Request
它的场景不会执行控制器。而且,在每个控制器中设置它也没有多大意义。
提前谢谢,
编辑
正如@beundead所建议的,我尝试实现一个过滤器来 Package 请求:
@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
我得到一个空字符串,
1条答案
按热度按时间dgiusagp1#
正如@beundead所建议的,我实现了一个过滤器,将我的请求封装在
ContentCachingRequestWrapper
:然后我就可以随时准备尸体了
contentAsByteArrayProperty
: