Весенняя загрузка не вызывает исключение HttpMessageNotReadableException

#spring #spring-boot #spring-mvc #spring-test-mvc

#весна #весенняя загрузка #spring-mvc #spring-test-mvc

Вопрос:

Существует простой LoginController с LoginRequest, аннотированный с помощью @RequestBody

 @RestController
public class LoginController{
    @PostMapping("/login")
    public ResponseEntity<?> doLogin(@Valid @RequestBody LoginRequest loginRequest, BindingResult bindingResult){
    }
}
// ...

public class LoginRequest {

    @NotBlank(message = "Email/Phone Can not be empty")
    private String emailAddressOrPhoneNumber;

    @NotBlank(message = "Password Can not be empty")
    private String password;

    public LoginRequest() {
    }
    // getters and setters
}
  

Я тестирую этот код с помощью WebMvcTest этого:

 @WebMvcTest(controllers = LoginController.class)
public class LoginControllerMvcTest {
    @Test
    public void test(){
        NewCustomerRequest invalidRequestType = // assume that there is a valid new customer object.
        MvcResult mvcResultForInvalidRequestType = mockMvc.perform("/login")
                .content(objectMapper.writeValueAsString(invalidRequestType))
                .contentType("application/json"))
                .andReturn();
    }
}
// ...
public class NewCustomerRequest {
    @NotBlank(message = "Email can not be empty")
    @EmailValueValidation
    private String emailAddress;

    @PhoneNumberRegexValidation
    private String phoneNumber;

    @NotBlank(message = "Password can not be empty")
    @InvalidPasswordCharacterValidation
    private String password;

    @NotBlank(message = "Password verify can not be empty")
    @InvalidPasswordCharacterValidation
    private String passwordVerify;
  

Что я хотел бы видеть, так это то, что spring выдает HttpMessageNotReadableException , потому что я пытаюсь сделать запрос на вход с другим типом json.

Однако запрос поступает на контроллер с этими значениями:

 loginRequest.emailAddressOrPhoneNumber = null
loginRequest.passsword = "passwordFromNewCustomerRequest"
  

Как мне заставить Spring генерировать исключение в этом случае?

Комментарии:

1. Если вы ничего не зададите в содержимом, spring выдаст HttpMessageNotReadableException MvcResult mvcResultForInvalidRequestType = MockMvc.perform(«/login») .ContentType(«application/json»)) .andReturn();

2. Spring должен выдавать исключение после отправки NewCustomerRequest . В противном случае это будет другой случай (например, не отправка содержимого)

3. возможно, вы забыли @Validated о своем классе контроллера? См. rieckpil.de/spring-web-mvc-cheat-sheet /…

4. @rieckpil, у меня это не сработало. Я прочитал раздел о @Validated и добавлен в класс my LoginController. Я также установил это свойство spring.jackson.deserialization.fail-on-unknown-properties=true , но оно также не сработало