我有一个带@ControllerAdvice注释的类和带@ExceptionHandler注释的方法来处理服务代码抛出的异常。在处理这些异常时,我希望获得作为请求POST操作一部分的@RequestBody。
我尝试为发送的请求创建POJO类,并尝试在异常处理程序类中检索,但它返回null。
遵循相同的解决方案,在这个查询~如何获得@RequestBody在一个@ExceptionHandler (Spring REST)
它不工作
我也尝试了httpServertRequest,即使返回null的请求数据。
我想在ExceptionHandler方法中获得api的请求体。根据请求体数据,我必须返回错误响应。
我还希望查询参数数据在ExceptionHandler方法中使用。
请提供解决方案。谢谢你。
请求体的流只读取一次,所以你不能在ControllerAdvice中第二次检索它,因此首先用ContentCachingRequestWrapper缓存请求体。像这样创建一个新的Spring组件:
@Component
public class FilterConfig extends GenericFilterBean{
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException{
HttpServletRequest request = (HttpServletRequest) servletRequest;
ContentCachingRequestWrapper wrapper = new ContentCachingRequestWrapper(request);
filterChain.doFilter(wrapper, servletResponse);
}
}
然后在@ControllerAdvice中让你的@ExceptionHandler接受ContentCachingRequestWrapper作为参数。
@ExceptionHandler(Exception.class)
public ResponseEntity<Object> handleDefaultException(Exception ex, ContentCachingRequestWrapper request){
String reqBody = "your request body is " + new String(request.getContentAsByteArray(), StandardCharsets.UTF_8);
// then do another thing you wanted for exception handling
}