簡體   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