前言
很多校验的东西,只在前端作校验是非常不可靠的。但是如果后台只在入口处作相关校验可能也会引发问题。
比如,前端调用A接口,使用springboot注解做校验,@NotBlank或者@Length等,A接口继续调用B方法做业务处理。
这时候有一个问题,如果某种情况下会出现其他接口直接调用B方法,那么A接口中做的参数校验无法覆盖,所以需要在B方法中做参数校验。
怎么做呢?这时候不能当做入口直接校验了,所以直接引入校验器,模拟入口注解校验(甚至可以做到更严格)
1.引入校验器
// 引入校验工具
private static ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
// 获取校验器
private static Validator validator = factory.getValidator();
2.执行校验
public static Response checkUser(User user) {
// 执行校验
Set<ConstraintViolation<User>> violationSet;
List<String> errorMessage = new ArrayList<>();
//校验入参为空
if (null == user) {
errorMessage.add("user is empty!");
return new Response(errorMessage,"Check not pass");
}
violationSet = validator.validate(user);
//violat.getPropertyPath():需要校验的属性(比如User对象中的age属性)
//violat.getMessage():校验不通过的原因(比如年龄最低为1岁,最高为120岁)
//violat.getInvalidValue():你所填写的值(700岁)
//该校验只校验hibernate.validator中的注解,每有一条校验不通过,violationSet就会add一条数据
if (violationSet.size() != 0) {
violationSet.forEach(violat -> {
errorMessage.add(violat.getPropertyPath() + ":" + violat.getMessage() + "! But your message:"
+ violat.getInvalidValue());
});
return new Response(errorMessage,"Check not pass");
}
//除了注解校验,还可以做其他校验,例如下
if (null == user.getName()) {
errorMessage.add("user name is empty!");
return new Response(errorMessage,"Check not pass");
}
//返回信息可以自己定义,增加相应错误码或者其他信息即可
return new Response("pass");
}