validator
简介
validator,翻译过来,就是“验证器”的意思。它是一种注解式参数校验,包名为javax.validation.Validator;
。
所谓注解式参数校验,是指通过给需要校验的(每个自定义类型对象的)对应属性添加注解,来完成指定校验。比如给属性添加注解@NotNull
,程序会在在业务逻辑的代码中调用validator.validate(指定类型的对象)时,自动检查带有该注解的属性,检查这些属性是否为空值。这篇博客中有非常详细的说明。
各种注解
给属性添加的注解,如下图所示,很详细,也可以看这篇博客。
好处
正常情况下(未使用hibernate-validator),如果用户调用你开发的接口时,未按你的要求传入参数,比如遗漏了自定义类型对象的些许属性,程序会直接报错,因为无法构造要传入接口的参数对象,如下图所示。
而使用了validator.validate进行参数校验的接口,不仅不会报错,程序正常运行,给用户返回200信息,还会提示错误发生的原因和位置,如下图所示。
validator.validate方法
业务逻辑代码中检查传入的参数时
首先需要在代码中的接口传入参数的位置上,给参数添加@Validated
注解;
自认,待进一步确认
注意,需要给每一个添加了validator各种检查注解的类型添加@Validated
注解,
比如,在自己自定义类型中,使用了枚举类型的属性,那么就需要在该枚举类型的声明处,添加@Validated
注解。如下所示。public class DeliveryfileEntity { @NotNull(message = "紧急程度不能为空") private urgencydegree urgencydegree; @Validated enum urgencydegree{ UnurgentMail("1"),urgentMail("2"); String code; private urgencydegree(String code) { // TODO Auto-generated constructor stub this.code = code; } }
然后,在需要检验参数的地方,调用validator.validate方法,来通过validator类实现对应注解的检查,如下所示。
public ResponseMessage<?> deliveryPaperfile(@RequestBody @ApiParam(name="投递记录对象") @Validated DeliveryfileEntity deliveryfileEntity) {
Set<ConstraintViolation<JeecgDemoEntity>> failures = validator.validate(jeecgDemo);
if (!failures.isEmpty()) {
return Result.error(JSONArray.toJSONString(BeanValidators.extractPropertyAndMessage(failures)));
}
为传入的参数类型中各个属性添加注解
自定义类型DeliveryfileEntity中的各个属性添加指定注解,这样在代码validator.validate
时,才会检查这些标有注解的参数,并依据注解检查相应的内容,如下所示。
public class DeliveryfileEntity {
//交换码
@NotNull
private String exchangecode;
//发文字号
@NotNull
private String issuednumber;
//紧急程度
@NotNull
private String urgencydegree;
//文件编号
@NotNull
private String filecode;
//文件标题
@NotNull
private String filetitle;
//文件类别
@NotNull
private String filetype;
//箱门编号
@NotNull
private String boxnumber;
//取件码
@NotNull
private String pickcode;
//操作人姓名
@NotNull
private String operatorName;
//操作人所属公司
@NotNull
private String sysCompanyCode;
@NotNull、@NotBlank、@NotEmpty间的区别
@NotNull 被注释的元素不能为null, 用在基本类型上?
@NotBlank 用在String上面?
@NotEmpty 被注释的字符串必须非空,用在集合类上面?
关于判空属性,有博客这样说,待确认。