一、前言
现在写代码,避免不了校验,比如校验字段是否为空呀、校验是否大于某个值呀、校验是否是email格式呀等等。
现在写基本就是if … else …
- 验证代码繁琐,重复劳动
- 方法内代码显得冗长
- 每次要看哪些参数验证是否完整,需要去翻阅验证逻辑代码
二、hibernate validator
基本上所有方法,开始的时候都要进行一下判断,这样重复代码很多。为了优化出更加简洁的代码。我们可以使用org.hibernate.validator
,使用注解来对代码的vo进行校验。
请看下面的demo:
vo:
import lombok.Data;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
@Data
public class ModifyVO extends OperatorVO implements Serializable {
private static final long serialVersionUID = -4653702540447208894L;
@NotNull(message = "007,id不能为空")
private Integer id;
@NotBlank(message = "007,字段名称不能为空")
@Length(min = 1, max = 50, message = "最多支持输入50个字")
private String tagName;
@NotNull(message = "007,创建方式不能为空")
private Integer tagRule;
}
modify 方法:
import javax.validation.Valid;
@PostMapping(value = "/v100/modify")
public BusiSystemResponse<Boolean> modify(@RequestBody @Valid ModifyVO vo) {
BusiSystemResponse<Boolean> response = new BusiSystemResponse<>();
if (result.hasErrors()) {
for (ObjectError error : result.getAllErrors()) {
logger.warn(error.getDefaultMessage());
}
response.setData(null);
response.setMsg(result.getAllErrors().get(0).getDefaultMessage());
response.setSingleStatus(CommonResponseCodeEnum.PARAM_ERROR.getCode());
return response;
}
return response;
}
三、详细的注解介绍
@Data
public class Demo2 {
@Length(min = 5, max = 17, message = "length长度在[5,17]之间")
private String length;
/**@Size不能验证Integer,适用于String, Collection, Map and arrays*/
@Size(min = 1, max = 3, message = "size在[1,3]之间")
private String age;
@Range(min = 150, max = 250, message = "range在[150,250]之间")
private int high;
@Size(min = 3,max = 5,message = "list的Size在[3,5]")
private List<String> list;
}
对象级联校验
对象内部包含另一个对象作为属性,属性上加@Valid,可以验证作为属性的对象内部的验证:(验证Demo2示例时,可以验证Demo2的字段)
@Data
public class Demo2 {
@Size(min = 3,max = 5,message = "list的Size在[3,5]")
private List<String> list;
@NotNull
@Valid
private Demo3 demo3;
}
@Data
public class Demo3 {
@Length(min = 5, max = 17, message = "length长度在[5,17]之间")
private String extField;
}
四、小结
更多请见 https://www.cnblogs.com/mr-yang-localhost/p/7812038.html