在@restcontrolleradvise上获取请求正文

wfveoks0  于 2021-07-12  发布在  Java
关注(0)|答案(1)|浏览(432)

我正在配置一个自定义错误处理,以便将每个错误请求记录到我的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 很好,我看到尸体了。但当我试穿 @ExceptionHandlerContentCachingRequestWrapper 我得到一个空字符串,

dgiusagp

dgiusagp1#

正如@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
    }
}

相关问题