当前位置: 首页 > 知识库问答 >
问题:

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

钦高峯
2023-03-14

我有一个用@ControllerAdvice注释的类和用@ExceptionHandler注释的方法来处理服务代码引发的异常。在处理这些异常时,我希望获得@RequestBody,它是请求POST操作的一部分。

我尝试为发送的请求创建POJO类,并尝试在异常处理程序类中检索,但它返回null。

遵循本查询中给出的相同解决方案~如何在@ExceptionHandler(Spring REST)中获取@RequestBody

它不起作用。

我还尝试了httpServertRequest,即使请求数据返回null。

我想在ExceptionHandler方法中获取api的请求正文。根据请求正文数据,我必须返回错误响应。

我还希望在ExceptionHandler方法中使用查询参数数据。

请提供解决方案。非常感谢。

共有1个答案

姜正初
2023-03-14

请求正文的流只读取一次,因此您无法在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);
    }
}

然后在@控件建议中让您的@ExceptionHandler接受ContentCachingRequest estWrapper作为参数


    @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
    }
 类似资料:
  • 问题内容: 我正在使用Spring Boot 1.4.1,其中包括。我有一个带有注释的类和带有注释的方法,用于处理服务代码引发的异常。处理这些异常时,我想记录和POST操作请求的一部分,因此我可以看到导致问题的请求正文,在我看来,该问题对于诊断至关重要。 在Spring Docs中,方法的方法签名可以包括多种内容。通常可以从此处通过或获取请求正文,但是如果我的控制器方法像我的所有方法一样解析请求正

  • 我使用的是Spring Boot1.4.1,其中包括Spring-Web-4.3.3。我有一个用注释的类和用注释的方法,以处理服务代码引发的异常。在处理这些异常时,我希望记录作为PUT和POST操作请求的一部分的,这样我就可以看到导致问题的请求体,在我的情况下,这对于诊断至关重要。 在每个Spring文档中,方法的方法签名可以包括各种内容,包括。请求正文通常可以从这里通过或获得,但是如果我的控制器

  • 问题内容: 我是Go的新手,但到目前为止,我非常喜欢它。 我有一个我不知道的问题。我正在将API从Node迁移到Go,并且有此日志必须捕获POST 原样 并将其保存到Postgresql数据库的type列中。 这意味着我不能使用或预定的任何东西。 POST是用body raw制作的,如下所示: 在Node + Hapi上非常简单: 然后我可以从访问JSON 。 我正在将Go与Echo一起使用,所以

  • 如何将转换为请求正文的表示形式?或者,如何正确地记录整个请求/响应,同时能够在其中散列潜在的凭据?

  • 我想通过Spring过滤器或方面记录超文本传输协议请求中的请求参数。我尝试了不同的方法,但请求参数为空或未调用方法。我使用的是POSTMAN,它是一个POST请求。 http://localhost:8080/available data 请求正文示例: {“keyUserAgent”:“CFNetwork/1209 Darwin/20.2.0”,“locale”:“en_US”,“eid”:“8

  • 我有以下问题:我试图在Spring控制器处理POST请求之前获取它的主体。为此,我使用HandlerInterceptorAdapter的preHandle()方法。 如本讨论中所述 SpringREST服务:从请求中检索JSON 我也使用使用此包装器,我设法打印了第一个POST请求的正文,但第二个POST抛出一个IOException:流关闭。 您对如何获取所有POST请求的正文有什么想法吗?