- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在配置自定义错误处理,以便将每个错误请求记录到我的 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 的过滤器时,它工作正常,我看到了主体。但是当我尝试使用 @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
}
}
关于java - 在 @RestControllerAdvise 上获取请求正文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60211209/
我正在配置自定义错误处理,以便将每个错误请求记录到我的 API。在我的场景中,了解请求中传递的有效负载非常重要,这样我就可以根据需要修复/测试/重新处理它。 我已经构建了一个简单的@RestContr
我构建了一个RestControlerAdvise: @RestControllerAdvice @Order(Ordered.HIGHEST_PRECEDENCE) public class Exc
在 Spring 4.x 中,如果您使用扩展 ResponseEntityExceptionHandler 的 @RestControllerAdvise(或 @ControllerAdvice),则
我是一名优秀的程序员,十分优秀!