Spring Test mockMvc игнорирует проверку

пожалуйста, помогите мне решить следующую проблему: у меня есть класс, в котором несколько полей помечены как @NotNull:

public class SearchCommentRequest {

@NotNull
private Date fromDate;

@NotNull
private Date toDate;

//...
}

Объект, если этот класс передается контроллеру как @RequestBody, также аннотированный @Valid:

@PostMapping(value = "/comment/search", consumes="application/json", produces = "text/csv")
public ResponseEntity<byte[]> searchComments(@RequestBody @Valid SearchCommentRequest searchRequest) {
    List<SearchCommentResult> comments = commentService.searchComments(searchRequest);

Итак, я ожидаю, что если fromDate или toDate имеет значение null, будет выдано исключение.

При написании своих интеграционных тестов я решил проверить и этот случай проверки:

@Test
public void searchCommentsValidateRequest() throws Exception {
    ObjectMapper mapper = new ObjectMapper();
    SearchCommentRequest request = new SearchCommentRequest();
    // toDate = null; 
    request.setFromDate(new Date());
    String requestBody = mapper.writer().writeValueAsString(request);

    mockMvc.perform(post(COMMENT_SEARCH_ENDPOINT)
            .contentType("application/json")
            .content(requestBody))
            .andDo(MockMvcResultHandlers.print())
            .andExpect(status().is(400));
}

Но похоже, что mockMvc игнорирует проверку. В поисках тех же проблем я нашел несколько источников, в которых решение добавляло следующие зависимости:

 <dependency>
    <groupId>javax.el</groupId>
    <artifactId>javax.el-api</artifactId>
    <version>2.2.4</version>
    <scope>test</scope>
 </dependency>

<dependency>
   <groupId>org.glassfish</groupId>
   <artifactId>javax.el</artifactId>
   <version>3.0.0</version>
</dependency>

Но это не помогло. Я использую Spring 4.3.3.RELEASE и вручную добавляю в pom.xml следующую зависимость:

<dependency>
   <groupId>javax.validation</groupId>
   <artifactId>validation-api</artifactId>
   <version>2.0.1.Final</version>
</dependency>

person Viacheslav    schedule 23.08.2018    source источник


Ответы (1)


На самом деле, @Notnull часто используется на уровне объекта. Он будет проверять и выдавать исключение, когда вы автоматически сохраняете сущность.

Если вы хотите проверить на контроллере и использовать @Valid.

Вы должны объявить больше о результате BindingResult

и проверь ошибки

if(result.hasErrors()){
//do something or throw exceptions
}
person huy    schedule 24.08.2018
comment
спасибо, я добавил @Valid на уровень свойств для работы в сочетании с NotNull, но проблема все еще сохраняется, mockMvc игнорирует проверку. BindingResult — это следующий шаг, я думаю, он дает вам механизм, чтобы решить, что делать, если произошла ошибка проверки. На данный момент мне не нужна какая-либо пользовательская логика, я просто хочу, чтобы было выбрано обычное исключение проверки. - person Viacheslav; 24.08.2018
comment
Spring validator проверит ваш объект и передаст результат в bindingresult. spring.io/guides/gs/validating-form-input не генерируйте исключения здесь, за исключением того, что вы проверяете и повторяете объекты ошибок в результате привязки и выдает исключение. - person huy; 25.08.2018
comment
Неправда, даже без результата привязки org.springframework.web.bind.MethodArgumentNotValidException. Bidningresult дает вам возможность решить, что делать с ошибками (даже игнорировать их), но это не значит, что без bindingresult не будет выброшено исключение. - person Viacheslav; 27.08.2018