我有一個 @RestControllerAdvice 我在 Spring Boot 中處理例外。我想記錄通過請求正文發送的資訊。如何從 Spring WebRequest 中獲取此資訊?
這是我的示例例外處理程式。
@RestControllerAdvice
public class CustomExceptionHandler extends ResponseEntityExceptionHandler {
@Override
protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex,
HttpHeaders headers, HttpStatus status, WebRequest request) {
// I want to add something here that I could log an info that is in the request body.
return super.handleMethodArgumentNotValid(ex, headers, status, request);
}
}
@M.Deinum 我嘗試使用 ContentCachingRequestWrapper,但我無法訪問正文內容。方法 contentCachingRequestWrapper.getContentAsByteArray() 回傳 null。
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
try {
ContentCachingRequestWrapper wrappedRequest = new ContentCachingRequestWrapper((HttpServletRequest) request);
wrappedRequest.getContentAsByteArray();
wrappedRequest.getInputStream();
chain.doFilter(wrappedRequest, response);
} finally {
LoggingContext.clear();
}
uj5u.com熱心網友回復:
關于使用的評論ContentCachingRequestWrapper是準確的,這是使用您的控制器建議的實作應該有效。
@Component
public class MyFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
ContentCachingRequestWrapper contentCachingRequestWrapper = new ContentCachingRequestWrapper(
(HttpServletRequest) servletRequest);
filterChain.doFilter(contentCachingRequestWrapper, servletResponse);
}
}
建議
@RestControllerAdvice
public class CustomExceptionHandler extends ResponseEntityExceptionHandler {
@Override
protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex, HttpHeaders headers,
HttpStatus status, WebRequest request) {
ContentCachingRequestWrapper nativeRequest = (ContentCachingRequestWrapper) ((ServletWebRequest) request).getNativeRequest();
String requestEntityAsString = new String(nativeRequest.getContentAsByteArray());
log.debug(requestEntityAsString);
return super.handleMethodArgumentNotValid(ex, headers, status, request);
}
}
uj5u.com熱心網友回復:
RequestBody 和 ResponseBody 可以只讀一次,所以在例外處理程式中實作 body 的其他方式 訪問這里
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/458707.html
