【问题标题】:How can I access the request object when handling a MethodArgumentNotValidException?处理 MethodArgumentNotValidException 时如何访问请求对象?
【发布时间】:2020-10-29 17:24:53
【问题描述】:

我正在处理请求对象验证失败后抛出的MethodArgumentNotValidException。所有常用的东西都准备好了:@Valid@ControllerAdvice 和一个扩展的ResponseEntityExceptionHandler,我在其中覆盖了handleMethodArgumentNotValid()

碰巧,我需要访问同一个请求对象以形成自定义的错误响应。一种方法是在请求到达控制器之前拦截请求,并创建一个带有所需字段的@RequestScope bean,以防以后验证失败。

有没有更好的办法?

【问题讨论】:

    标签: java spring spring-boot spring-mvc bean-validation


    【解决方案1】:

    感谢一位同事的建议,我发现MethodArgumentNotValidException 中的BindingResult 有一个名为getTarget() 的方法,它返回经过验证的对象。从方法签名 (Object getTarget()) 可以看出,返回值需要强制转换。

    【讨论】:

      【解决方案2】:

      MethodArgumentNotValidException 类中应该有错误字段。您的 handleMethodArgumentNotValid 函数可能如下所示。

      @ExceptionHandler(MethodArgumentNotValidException.class)
      @ResponseStatus(value = HttpStatus.BAD_REQUEST)
      @ResponseBody
      public CustomInputErrorResponse handleMethodArgumentNotValid(MethodArgumentNotValidException e) {
          String message = "Invalid inputs";
          ArrayList<String> fieldNames = new ArrayList<String>();
          for (FieldError fieldError : e.getBindingResult().getFieldErrors()) {
              fieldNames.add(fieldError.getField());
          }
          return new CustomInputErrorResponse(message, fieldNames);
      }
      

      考虑到您有一个 CustomInputErrorResponse 类,它接受两个参数作为自定义消息和错误字段名称。

      【讨论】:

      • 感谢您的回答。也许我在问题中表达得不够清楚,但我不需要无效字段的名称。我需要验证失败的整个请求对象(即所有字段)。原因是,验证失败后,我可能不得不使用一些有效字段来形成自定义错误响应。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多