如何在springboot(REST)的ExceptionHandler类中获取请求体数据



我有一个带@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
}

最新更新