在@RestControllerAdvise上获取请求正文

JoãoMenighin:

我正在配置自定义错误处理,以便将每个错误的请求记录到我的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我得到一个空字符串,

JoãoMenighin:

正如@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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章