校验框架hibernate-validator
1.pom.xml依赖
<!--导入校验的jsr303规范:接口-->
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
<!--导入校验框架实现技术-->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.1.0.Final</version>
</dependency>
2.给bean加注解
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
@Data
public class User {
//@NotBlank(message="姓名不能为空",groups = {Save.class}) 分组校验,不指定分组不生效
@NotBlank(message="姓名不能为空")
@ApiModelProperty(value="姓名",required = true)
private String name;
@NotBlank(message="请输入您的年龄")
// @Max(value=30,message="年龄不允许超过60岁")
@ApiModelProperty(value="年龄",required = true)
private String age;
//嵌套校验
@Valid
private Address address;
}
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
@Data
public class Address {
@NotBlank(message="请输入地址")
private String address;
}
分组校验接口,无需实现
public interface Save {
}
public interface Update {
3.测试
import cn.ztuo.swagger.pojo.Person;
import cn.ztuo.swagger.pojo.User;
import cn.ztuo.swagger.valid.Save;
import cn.ztuo.swagger.vo.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.validation.Errors;
import org.springframework.validation.FieldError;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import sun.management.GcInfoBuilder;
import javax.validation.Valid;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Api(value="swagger-test",tags="channer",description = "swagger测试Api")
@RestController
@RequestMapping("/swagger")
public class SwaggerController {
@ApiOperation("访问person测试")
@GetMapping("/person")
public Person test(){
Person p=new Person();
p.setId("001");
p.setAddress("紫荆城");
p.setName("老八");
p.setAge(32);
return p;
}
@ApiOperation("带参访问person2测试")
@PostMapping("/person2")
public Result test1(@Valid @RequestBody User user, Errors errors){
Result result=new Result();
System.out.println(user);
Person p=new Person();
p.setId("002");
p.setAddress("驻马店");
p.setName("六六六");
p.setAge(32);
//Errors对象用于封装校验结果,如果不满足校验规则,对应的校验结果封装到该对象中,包含校验的属性名和校验不通过返回的消息
//判定Errors对象中是否存在未通过校验的字段
Map<String,String> map=new HashMap<>();
if(errors.hasErrors()){
//获取所有未通过校验规则的信息
List<FieldError> fieldErrors = errors.getFieldErrors();
for (FieldError fieldError : fieldErrors) {
map.put(fieldError.getField(), fieldError.getDefaultMessage());
}
result.setDada(map);
return result;
}
result.setDada(p);
return result;
}
//分组校验
@ApiOperation("带参访问person3测试")
@PostMapping("/person3")
public Person test2(@Validated({Save.class}) @RequestBody User user){
System.out.println(user);
Person p=new Person();
p.setId("003");
p.setAddress("曹县");
p.setName("擎天柱");
p.setAge(32);
return p;
}
}
4.注解说明
1. 开启校验
名称:@Valid 、 @Validated
类型:形参注解
位置:处理器类中的实体类类型的方法形参前方
作用:设定对当前实体类类型参数进行校验
范例:
2.设置校验规则
名称:@NotNull, @NotBlank, @NotEmpty
类型:属性注解
位置:属性上方
作用:设定当前属性校验规则
范例:每个校验规则所携带的参数不同,根据校验规则进行相应的调整
易错点:必须给name,age等属性编写getter,setter方法
3种判定空校验器的区别
int, double 选择@NotNull
String 选择@NotBlank
数组选择@NotEmpty