比如说,你写了一个后台系统,接收用户的请求,经过运算后返回结果,很通用的一个实现方案。假定所有的方法都需要校验参数是否为空,不然就可能有NullPointerException,如果系统有N个接口,每个接口参数有M个,你需要写N * M个if判断语句。如
if (StringUtils.isBlank(request.getA())) {
throw new IllegalArgumentException("A is blank");
}
这么写下来,肯定代码是很丑的。那怎么办呢?记得我们之前说过的编码理念,Don’t repeat yourself,就派上用场了。
简单校验
编写需要校验的bean
@NotNull(message="名字不能为空")
private String userName;
@Max(value=120,message="年龄最大不能查过120")
private int age;
@Email(message="邮箱格式错误")
private String email;
校验方法
@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
public class ReportVO {
@NotNull(message = "举报内容不能为空")
@Valid
private ReportContent content;
@NotNull(message = "举报信息不能为空")
@Valid
private ReportInfo info;
}
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; // 处理时间
}
校验方法
public void report(@RequestBody @Valid ReportVO reportVo,BindingResult result) {
contentService.report(reportVo.getContent(), reportVo.getInfo());
}