Как перехватить сообщение об ошибке при весенней загрузке веб-привязки? - PullRequest
0 голосов
/ 11 июня 2019

Я пытаюсь сделать регистрационные коды пользователей с помощью весенней загрузки веб-стартера.Во-первых, это класс формы регистрации, включающий ограничения.

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

И я делаю ошибку преднамеренно, а затем на консоль выводится сообщение об ошибке, как показано ниже, и генерируется исключение 400 с / error / 400 html.

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 нарушает ограничение.Я хочу знать, как поле error registerForm может быть передано в / error / 400 html.Любая идея, пожалуйста.

Ответы [ 2 ]

1 голос
/ 11 июня 2019

первый шаг: проверить данные в контроллере, как это

@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
    }
0 голосов
/ 11 июня 2019

Вам необходимо расширить 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);
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...