1. 引入pom
<!--做验证的,引入后记得刷新maven。就用到了:hibernate-validator 和 validation-api。 可以单加这两个包-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<!--<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
</dependency>
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
</dependency>-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
2. controller使用
返回的类
@Data
public class Pesponsibles {
private String field;
private String defaultMessage;
}
controller方法
//post 方法,返回json,json返回注解写在方法上,也可以。 @Valid 和 Validated 都行,推荐 valid
@RequestMapping(value = "/test", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody
ResponseEntity<Pesponsibles> testBindingResult(@Valid @RequestBody Parameter parameter, BindingResult bindingResult) {
log.info("测试开始,这个是lombok注解");
//返回
Pesponsibles p = new Pesponsibles();
//如果包含错误
if (bindingResult.hasErrors()) {
//获取到 所有错误
List<FieldError> fieldErrors = bindingResult.getFieldErrors();
//使用 forEach遍历
fieldErrors.forEach(fieldError -> {
//日志打印不符合校验的字段名和错误提示
log.error("错误的字段是 : {} ,消息是 : {}", fieldError.getField(), fieldError.getDefaultMessage());
p.setField(fieldError.getField());
p.setDefaultMessage(fieldError.getDefaultMessage());
break;
});
// pesponsibles.setError_msg(fieldErrors);
return new ResponseEntity<>(p, HttpStatus.BAD_REQUEST);
}
return new ResponseEntity<>(p, HttpStatus.OK);
}
//使用 普通for遍历
for (int i = 0; i < fieldErrors.size(); i++) {
//控制台打印不符合校验的字段名和错误提示
System.out.println("error field is :" + fieldErrors.get(i).getField() + ",message is :" + fieldErrors.get(i).getDefaultMessage());
}
3. 请求参数
@Data
public class Parameter {
@NotEmpty(message="姓名不能为空")
private String name;
@Min(value = 18, message = "年龄必须大于18岁")
private int age;
@NotEmpty(message="hobbies不能为空")
private List<String> hobbies;
@NotBlank(message="账号不能为空")
private String account;
@Size(min=5,max=10,message="密码的长度应该在5和10之间")
private String password;
@Email(message="邮箱格式错误")
private String email;
}
4. 测试
{
"name":"张三",
"age":22,
"hobbies":["唱歌","游泳"],
"account":"123456",
"password":"123456",
"email":"123456"
}
//响应:
{
"field": "email",
"defaultMessage": "邮箱格式错误"
}
5. model注解详细
1. 整理1
@Data
public class OrgaByIdOutModel implements Serializable {
/**
* 使用,这两个注解拦截
* javax.validation.Valid;
* org.springframework.validation.annotation.Validated; 提供了一个分组功能
*
* 使用:这两个包下的注解 进行校验。自己可以去看多少个注解。
* org.hibernate.validator.constraints.*
* javax.validation.constraints.*
*
* constraints 下:
* 这个包下就有 Length Range(底层包的还是javax.validation.constraints)
*
* validation 下:
* Valid NotBlank NotNull Null Pattern Email Max Min
* Size 和 Length 一样吧
* 还有 NotEmpty 时间限制 等等
*/
@NotNull(message = "上级组织" + MyConstant.NOT_EMPTY)
@JsonFormat(shape = JsonFormat.Shape.STRING)
private Long superOrga;
/*
* 状态
*/
@Range(min = 1, max = 2, message = "启用状态" + MyConstant.ILLEGAL)
private Integer status;
@Pattern(message = "企业电话" + MyConstant.ILLEGAL, regexp = MyConstant.CONTACT_NUMBER_REGEX)
private String phone;
//这里用了一次size
@Size(max = 80, min = 4, message = "企业地址" + MyConstant.ILLEGAL)
private String address;
@Length(min = 2, max = 10, message = "法人姓名" + MyConstant.ILLEGAL)
private String legalPersonName;
}
/**
* 手机号正则。用于手机号形式账号验证
*/
String PHONE_REGEX = "^1\\d{10}$";
2. 整理2
常用校验注解
@Null 只能是null
@NotNull 不能为null 注意用在基本类型上无效,基本类型有默认初始值
@AssertFalse 必须为false
@AssertTrue 必须是true
字符串/数组/集合检查:(字符串本身就是个数组)
@Pattern(regexp="reg") 验证字符串满足正则
@Size(max, min) 验证字符串、数组、集合长度范围
@NotEmpty 验证字符串不为空或者null
@NotBlank 验证字符串不为null或者trim()后不为空
数值检查:同时能验证一个字符串是否是满足限制的数字的字符串
@Max 规定值得上限int
@Min 规定值得下限
@DecimalMax("10.8") 以传入字符串构建一个BigDecimal,规定值要小于这个值
@DecimalMin 可以用来限制浮点数大小
@Digits(int1, int2) 限制一个小数,整数精度小于int1;小数部分精度小于int2
@Digits 无参数,验证字符串是否合法
@Range(min=long1,max=long2) 检查数字是否在范围之间
这些都包括边界值
日期检查:Date/Calendar
@Post 限定一个日期,日期必须是过去的日期
@Future 限定一个日期,日期必须是未来的日期
其他验证:
@Vaild 递归验证,用于对象、数组和集合,会对对象的元素、数组的元素进行一一校验
@Email 用于验证一个字符串是否是一个合法的右键地址,空字符串或null算验证通过
@URL(protocol=,host=,port=,regexp=,flags=) 用于校验一个字符串是否是合法UR
6. 统一拦截
在Spring 3.2中,
- 新增了@ControllerAdvice、@RestControllerAdvice 注解,
- 可以用于定义@ExceptionHandler、@InitBinder、@ModelAttribute,
- 并应用到所有@RequestMapping、@PostMapping, @GetMapping注解中。
1. controller删减
@RequestMapping(value = "/test", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody
ResponseEntity<Parameter> testBindingResult(@Valid @RequestBody Parameter parameter) {
log.info("执行正确了");
return new ResponseEntity<>(parameter, HttpStatus.OK);
}
2. 增强型控制器
@ControllerAdvice
public class GlobalExceptionHandlerAdvice {
/**
* 参数验证异常处理
* 异常处理handler,值为 方法参数没有验证异常,绑定异常
*
* @return 错误信息
* @author 同事小伙
*/
@ResponseBody
@ExceptionHandler(value = {MethodArgumentNotValidException.class, BindException.class})
public ResponseEntity<Pesponsibles> methodArgumentNotValidExceptionHandler(Exception e, BindingResult bindingResult) {
Pesponsibles p = new Pesponsibles();
// 如果没有参数异常则直接返回错误信息
if (bindingResult.hasErrors()) {
//有异常下面处理
} else {
//bindingResult没有异常,但是exception有异常
p.setDefaultMessage(e.getMessage());
return new ResponseEntity<>(p, HttpStatus.BAD_REQUEST);
}
p.setField("bindingResult错误字段");
//如果包含错误
if (bindingResult.hasErrors()) {
//获取到 所有错误
List<FieldError> fieldErrors = bindingResult.getFieldErrors();
// 如果有参数异常,则获取default message,并返回
StringBuilder message = new StringBuilder("提示:");
//拼接 错误
fieldErrors.forEach(i -> message.append(i.getDefaultMessage()).append("!"));
p.setDefaultMessage(message.toString());
// pesponsibles.setError_msg(fieldErrors);
return new ResponseEntity<>(p, HttpStatus.BAD_REQUEST);
}
return new ResponseEntity<>(p, HttpStatus.BAD_REQUEST);
}
}
3. 测试
{
"name":"张三",
"age":22,
"hobbies":["唱歌","游泳"],
"account":"123456",
"password":"123456",
"email":"123456@qq.com"
}
打印:
执行正确了
返回:
{
"name": "张三",
"age": 22,
"hobbies": [
"唱歌",
"游泳"
],
"account": "123456",
"password": "123456",
"email": "123456@qq.com"
}
测试2
{
"name":"张三",
"age":17,
"hobbies":["唱歌","游泳"],
"account":"123456",
"password":"123456",
"email":"123456"
}
返回:
{
"field": "bindingResult错误字段",
"defaultMessage": "提示:年龄必须大于18岁!邮箱格式错误!"
}