繁体   English   中英

Spring Boot Web绑定时如何拦截错误信息?

[英]How to intercept the error message when spring boot web binding?

我尝试使用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。 任何想法,请。

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

@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
    }

您需要扩展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);
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM