我在之前进行接口开发的时候经常会有大量的参数验证,而我一般的操作方法就是在controller中进行参数的校验,这样并没有什么错,但是代码略显臃肿,而使用springboot的@vaild注解可以减少不少代码量。
看一个例子,要求id,name,age都不能为空,而且年龄必须在1-100岁之间。
实体类:
package com.example.demo.entity;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
public class User {
@NotNull(message = "id不能为空")
private Integer id;
@NotBlank(message = "姓名不能为空")
private String name;
@NotNull(message = "age不能为空")
@Max(value = 100,message = "年龄不能超过100岁")
@Min(value = 1,message = "年龄不能小于1岁")
private Integer age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
看到上面的代码使用了一些注解,下面介绍一下注解的含义

实体类的规则我们写好了,下面是控制层方法代码
1.如果我们想一次性获取所有的参数验证是否满足条件并返回:
@RequestMapping("test1")
public AjaxResult test1(@Valid User user,Errors error) {
if(error.hasErrors()) {
List<FieldError> errorList = error.getFieldErrors();
int s=errorList.size();
String e[]=new String[s];
for(int i=0;i<s;i++) {
FieldError f=errorList.get(i);
e[i]=f.getDefaultMessage();
}
return AjaxResult.fail(e);
}
return AjaxResult.success("ok");
}
测试结果是:


2.如果希望只要有一个字段不符合条件就返回信息:
@RequestMapping("test2")
public AjaxResult test2(@Valid User user,BindingResult bindingResult) {
if(bindingResult.hasErrors()) {
return AjaxResult.fail(bindingResult.getFieldError().getDefaultMessage());
}
return AjaxResult.success("ok");
}
测试结果:


自定义注解验证:
有时我们还会遇到一些验证比如验证银行卡号,身份证号等,那么就需要自定义注解验证了。
下面我们自定义一个注解简单模拟一些判断姓名必须为“jia”
自定义注解:
package com.example.demo.util;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;
@Target({ElementType.METHOD,ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = MyValidClass.class)
public @interface MyValid {
String message() ;
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
}
@Target和@Retention这两个原注解就不介绍了,看@Constraint这个注解,它表示我们判断逻辑的具体实现类是哪个类。
那么我们就定义一个判断逻辑的类:
package com.example.demo.util;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
/**
* 自定义验证规则
*/
public class MyValidClass implements ConstraintValidator<MyValid, Object> {
@Override
public boolean isValid(Object value, ConstraintValidatorContext context) {
String name = (String)value;
if ("jia".equals(name)) {
return true;
}
return false;
}
}
那么在name字段中只需加@MyValid注解即可
@NotBlank(message = "姓名不能为空")
@MyValid(message="name的值必须为jia")
private String name;

看返回结果可知,自定义注解验证生效。