【问题标题】:How to intercept the error message when spring boot web binding?spring boot web binding时如何拦截报错信息?
【发布时间】:2019-10-25 08:19:21
【问题描述】:

我尝试使用 spring boot web starter 制作用户注册码。 首先,这些是包含约束的注册表单类。

@Data
public class RegisterForm {

    @NotBlank(message = "Not valid username.") // (1)
    @Size(min=2, max=30, message="minimum 2 and maximum 30") // (3)
    private String username;

    @NotBlank(message = "Not valid password") // (1)
    @Size(min=5, message = "minimum 5") // (3)
    private String password;

    @Size(max=50, message="maximum 50") // (3)
    private String fullname;

    @NotEmpty(message = "Not valid email") // (2)
    private String email;
}

接下来的代码是绑定用户类和注册表单类的控制器类。

@RequestMapping(value="/users/register", method=RequestMethod.POST)
public String register(@Valid RegisterForm registerForm, Model model, BindingResult bindingResult) {
        if(!bindingResult.hasErrors()) {
            User user = new User();
            user.setUsername(registerForm.getUsername());
            user.setPassword(registerForm.getPassword());
            user.setEmail(registerForm.getEmail());
            user.setFullname(registerForm.getFullname());
            user.setRole(UserRole.USER);

            this.userService.register(user);

            return "redirect:/home";
        }

        return "/users/register";
    }

下面的代码是错误控制器类。

@RequestMapping("/error")
public String errorHandle(HttpServletRequest request) {
        Object status = request.getAttribute(RequestDispatcher.ERROR_STATUS_CODE);
        if(status != null) {
            Integer statusCode = Integer.valueOf(status.toString());

            if(statusCode.equals(HttpStatus.BAD_REQUEST.value())) {
                return "/errors/400";
            } else if(statusCode.equals(HttpStatus.NOT_FOUND.value())) {
                return "/errors/404";
            } else if(statusCode.equals(HttpStatus.FORBIDDEN.value())) {
                return "/errors/403";
            } else if(statusCode.equals(HttpStatus.INTERNAL_SERVER_ERROR.value())) {
                return "/errors/500";
            }
        }

        return "errors/default";
    }

我故意犯了错误,然后错误消息被带到控制台上,如下所示,并使用 /error/400 html 引发 400 异常。

Field error in object 'registerForm' on field 'username': rejected value []; default message [minimum 2 and maximum 30]
Field error in object 'registerForm' on field 'username': rejected value []; default message [Not valid username]
Field error in object 'registerForm' on field 'email': rejected value []; default message [Not valid email]
Field error in object 'registerForm' on field 'password': rejected value []; default message [Not valid password]
Field error in object 'registerForm' on field 'password': rejected value [];default message [minimum 5]]

我的问题是我不知道如何将 registerForm 消息的字段错误发送到 /error/400 html,以便用户可以确认 registerForm 的哪个字段违反了约束。我想知道如何将 registerForm 的字段错误转移到 /error/400 html。有什么想法,请。

【问题讨论】:

    标签: java spring spring-boot


    【解决方案1】:

    第一步: 像这样验证控制器中的数据

    @RequestMapping(value="/users/register", method=RequestMethod.POST)
    public String register(@Valid RegisterForm registerForm)......
    

    第二步: 制定一个捕捉异常的控制器建议

    @ControllerAdvice
    public class GlobalExceptionHandler {
    
        @ExceptionHandler(value = MethodArgumentNotValidException.class)
        @ResponseBody
        public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
            //here you can use api of MethodArgumentNotValidException to do anything you want
            //e.getBindingResult(),e.getFieldErrors(),etc;
            // you can change the return type of Object
        }
    

    【讨论】:

      【解决方案2】:

      您需要扩展ResponseEntityExceptionHandler,它提供跨所有RequestMapping 方法的集中异常处理。这个基类提供了一个 ExceptionHandler 方法来处理内部 Spring MVC 异常。此方法返回一个ResponseEntity,用于使用HttpMessageConverter 消息转换器写入响应。

      @ControllerAdvice
      @Order(Ordered.HIGHEST_PRECEDENCE)
      public class RestExceptionHandler extends ResponseEntityExceptionHandler {
         // All Exceptions Handler.
         @ExceptionHandler(Exception.class)
         public final ResponseEntity<ExceptionBean> handleAllExceptions(Exception ex, WebRequest request) {...}
      
         // Unique Constraint Violation Exception Handler.
         @ExceptionHandler(DataIntegrityViolationException.class)
         public final ResponseEntity<ExceptionBean> handleDataIntegrityViolationExceptions(DataIntegrityViolationException ex, WebRequest request) {...}
      
         // Custom Exceptions Handler.
         @ExceptionHandler(DomainException.class)
         public final ResponseEntity<ExceptionBean> handleDomainExceptions(DomainException ex, WebRequest request) {
              ExceptionBean exceptionBean = new ExceptionBean(new Date(), ex.getMessage(),
                      request.getDescription(false));
      
              LOGGER.error(ex.getMessage(), ex);
      
              return new ResponseEntity<>(exceptionBean, HttpStatus.BAD_REQUEST);
          }
      
      }
      

      【讨论】:

        猜你喜欢
        • 2018-08-09
        • 2016-09-19
        • 1970-01-01
        • 2019-01-14
        • 1970-01-01
        • 2023-03-21
        • 2021-03-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多