请帮助我解决以下问题: 我有一堂课,其中几个字段被标记为@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中的任何一个为空-都会引发异常。
在编写集成测试时,我还决定检查此验证案例:
@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>
答案 0 :(得分:0)
实际上,@ Notnull通常在实体级别使用。 当您自动保留实体时,它将验证并引发异常。
如果要在控制器上验证并使用@Valid。
您应该声明有关BindingResult结果的更多信息
并检查错误
if(result.hasErrors()){
//do something or throw exceptions
}