ControllerAdvice не перехватил ошибки BindingResult - PullRequest
2 голосов
/ 25 октября 2019

Я пытаюсь переопределить сообщения об ошибках по умолчанию в BindingResult. Я реализовал совет контроллера, как это

@ControllerAdvice
public final class DefaultControllerAdvice {
    private static final String ERROR_MESSAGE_FORMATTER = " - ";

    @ExceptionHandler(BindException.class)
    @ResponseStatus(value = HttpStatus.BAD_REQUEST)
    public List<String> handleValidationException(final BindException exception) {
        return exception.getBindingResult()
                .getAllErrors()
                .stream()
                .filter(error -> error instanceof FieldError)
                .map(objectError -> (FieldError) objectError)
                .map(errorMessageFormatter)
                .collect(Collectors.toList());
    }

    private final Function<FieldError, String> errorMessageFormatter =
            error -> error.getField() + ERROR_MESSAGE_FORMATTER + error.getDefaultMessage();
}

, и мой контроллер

@PostMapping(value = "/register")
    private String postRegistration( @ModelAttribute @Valid final  UserCreateFormDto user, final BindingResult result,
                                    final RedirectAttributes redirectAttributes, final WebRequest webRequest) {
        try {
            if (result.hasErrors()) {
                redirectAttributes.addFlashAttribute("org.springframework.validation.BindingResult.user", result);
                redirectAttributes.addFlashAttribute("user", user);
                throw new BindException(result);
            }
            if (userService.checkEmailExist(user.getEmail())) {
                throw new UserNotExistsException("User with email: "+ user.getEmail()+" already exists.");
            }
            final User registered = userService.createNewUserAccount(user);
            final String appUrl = webRequest.getContextPath();
            eventPublisher.publishEvent(
                    new RegistrationCompleteEvent(registered, webRequest.getLocale(), appUrl));
            return "redirect:/login?success";

        } catch (UserNotExistsException error) {
            return "redirect:/register?exists";
        } catch (BindException error) {
            return "redirect:/register";
        }
    }

и контрольный пример

 @Test
    public void shouldNotCreateUserWhenUsernameIsEmpty() throws Exception {
        //given
        final UserCreateFormDto userCreateFormDto = createUserCreateForm();
        final User user = createUser();

        given(userService.checkEmailExist(userCreateFormDto.getEmail())).willReturn(false);
        given(userService.createNewUserAccount(any(UserCreateFormDto.class))).willReturn(user);

        //when
        final MvcResult response = mockMvc
                .perform(post("/register").with(csrf())
                        .contentType(MediaType.MULTIPART_FORM_DATA)
                        .param("username","")
                        .param("email",userCreateFormDto.getEmail())
                        .param("password", Arrays.toString(userCreateFormDto.getPassword()))
                        .param("matchingPassword", Arrays.toString(userCreateFormDto.getMatchingPassword())))
                .andReturn();


        //then
        assertThat(response.getFlashMap().isEmpty()).isFalse();
        assertThat(response.getResponse().getStatus()).isEqualTo(HttpStatus.FOUND.value());
        assertThat(response.getResponse().getRedirectedUrl()).isEqualTo("/register");
        verify(userService, times(1)).checkEmailExist(userCreateFormDto.getEmail());
        verify(userService, times(0)).createNewUserAccount(any(UserCreateFormDto.class));

Мой вопрос заключается в том, как получить сообщение об ошибке по умолчанию для bindingResult? Я хотел бы проверить, что получает сообщение об ошибке при проверке полей ввода.

...