参数校验是我们程序开发中必不可少的过程。为了保持程序的健壮性,需要对数据进行校验。
简单的校验
在po实体类中添加注解
import org.hibernate.validator.constraints.Length;
/**
* 通知记录
*
* @author cuijiao
* @date 2018年1月12日
*/
public class Inform {
private Long id;
@Length(min = 0, max = 50)
private String title;
@Length(min = 0, max = 255)
private String content;
private String acceptorId;
private String acceptorName;
// 通知方式:短信、邮箱、系统通知
private Integer informWay;
// 是否紧急0否1是
private Boolean isUrgent;
}
在controller中使用此校验
/**
* 添加Inform对象
* @param book
*/
@RequestMapping(value = "/test", method = RequestMethod.POST)
public void addInform(@Valid Inform inform) {
System.out.println(inform.toString());
}
- 关联校验
在一个有关联关系的字段或者属性上标注 @Valid . 这样,如果一个对象被校验,那么
它的所有的标注了 @Valid 的关联对象都会被校验
/**
*Person类
*/
public class Person {
@NotNull
private String name;
public Person() {
}
}
/**
*Car类
*/
public class Car {
@NotNull
@Valid
private Person driver;
public Car(Person driver) {
this.driver = driver;
}
如果校验 Car 的实例对象的话,因为它的driver属性标注了 @Valid , 那么关联的 Person 也会被校验.
所以,如果对象 Person 的name属性如果是 null 的话,那么校验会失败.
关联校验也适用于集合类型的字段, 也就是说,任何下列的类型:
•数组
•实现了 java.lang.Iterable 接口( 例如 Collection , List 和 Set )
•实现了 java.util.Map 接口
如果标注了 @Valid , 那么当主对象被校验的时候,这些集合对象中的元素都会被校验.
public class RecordAttachment {
private Long id;
private Long opId;
private String name;
@URL
private String url;
}
/**
* 操作日志封装对象
*
* @author cuijiao
* @date 2018年1月22日
*/
public class RecordDTO extends Record {
/**
* 操作日志附件
*/
@Valid
private List<RecordAttachment> recordAttachments;
}
如果校验RecordDTO时,附件集合中任一附件url不符合url正则,校验就会失败
- 分组校验
定义两个空接口,分别代表对象的增加校验规则和修改校验规则
/**
* 用于添加分组标识
*
* @author cuijiao
* @date 2018年1月17日
*/
public interface ValidAdd {
}
/**
* 用于修改分组标识
*
* @author cuijiao
* @date 2018年1月17日
*/
public interface ValidUpdate {
}
po实体类上添加注解时使用指明所述的分组
/**
* 工单提醒设置
*
*
* @author cuijiao
* @date 2018年1月16日
*/
public class Remind {
@NotNull(groups = { ValidUpdate.class })
private Long id;
@NotNull(groups = { ValidAdd.class })
@Length(min = 0, max = 50, groups = { ValidAdd.class, ValidUpdate.class })
private String name;
// 工单类型+业务类型(唯一索引)
@NotNull(groups = { ValidAdd.class })
private Integer wsType;
@NotNull(groups = { ValidAdd.class })
private Integer businessType;
/**
* (数据字典)紧急程度:普通、紧急、非常紧急
*/
private Integer urgentLevel;
@Length(min = 0, max = 50, groups = { ValidAdd.class, ValidUpdate.class })
private String informTitle;
@Length(min = 0, max = 255, groups = { ValidAdd.class, ValidUpdate.class })
private String informContent;
}
启用校验
此时启用校验和之前的不同,需要指明启用哪一组规则
/**
* 新建提醒设置
*
*
* @param remind
* @return
*
* @author cuijiao
* @date 2018年1月16日
*/
@RequestMapping(value = "add", method = RequestMethod.POST)
public void addRemind(@Validated(value = { ValidAdd.class }) Remind remind) {
//添加操作
@Validated(value = { ValidAdd.class }) 表示使用ValidAdd这套校验规则
}
}
/**
*
* 更新提醒设置
*
* @param remind
* @return
*
* @author cuijiao
* @date 2018年1月16日
*/
@RequestMapping(value = "update", method = RequestMethod.POST)
public ResponseEntity updateRemind(@Validated(value = { ValidUpdate.class }) Remind remind) {
// 更新提醒設置
@Validated(value = { ValidUpdate.class }) 表示使用ValidUpdate这套校验规则
}