@NotNull
小明 Lv6

摘自 mhtbbx:”Java中的注解 - @NotNull”

比如说,你写了一个后台系统,接收用户的请求,经过运算后返回结果,很通用的一个实现方案。假定所有的方法都需要校验参数是否为空,不然就可能有NullPointerException,如果系统有N个接口,每个接口参数有M个,你需要写N * M个if判断语句。如

1
2
3
if (StringUtils.isBlank(request.getA())) {
throw new IllegalArgumentException("A is blank");
}

这么写下来,肯定代码是很丑的。那怎么办呢?记得我们之前说过的编码理念,Don’t repeat yourself,就派上用场了。

简单校验

编写需要校验的bean

1
2
3
4
5
6
@NotNull(message="名字不能为空")
private String userName;
@Max(value=120,message="年龄最大不能查过120")
private int age;
@Email(message="邮箱格式错误")
private String email;

校验方法

1
2
3
4
5
6
7
8
9
10
11
@RequestMapping("/login")
public String testValid(@Valid User user, BindingResult result){
if (result.hasErrors()){
List<ObjectError> errorList = result.getAllErrors();
for(ObjectError error : errorList){
System.out.println(error.getDefaultMessage());
}
}

return "test";
}

备注:这里一个@Valid的参数后必须紧挨着一个BindingResult 参数,否则spring会在校验不通过时直接抛出异常

级联校验

编写相关的bean

1
2
3
4
5
6
7
8
9
10
public class ReportVO {  

@NotNull(message = "举报内容不能为空")
@Valid
private ReportContent content;

@NotNull(message = "举报信息不能为空")
@Valid
private ReportInfo info;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class ReportInfo extends BaseTenantDomain<String> {  

private String reportContentId;

@NotBlank(message = "举报人id不能为空")
private String reportorId;

@NotNull(message = "举报类型不能为空")
private ReportType reportType;

@NotBlank(message = "举报详细描述不能为空")
@Size(max=100, message = "举报详细描述不能超过100")
private String desc;

private Date reportTime; // 举报时间
private Date dealTime; // 处理时间

}

校验方法

1
2
3
public void report(@RequestBody @Valid ReportVO reportVo,BindingResult result) {  
contentService.report(reportVo.getContent(), reportVo.getInfo());
}
 评论