一、引入依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId>
</dependency>
二、校验注解介绍
限制 | 说明 |
---|---|
@NotNull | 不为null |
@NotEmpty | ①不为null ②字符串或集合长度>0 |
@NotBlank | ①只能校验字符串 ②不为null ③字符串去除前后缀空格后仍有内容 |
@Min | 限制最小值(整数) |
@Max | 限制最大值(整数) |
@Size | 限制长度在min~max之间 |
@DecimalMin | 限制最小值 |
@DecimalMax | 限制最大值 |
对邮箱格式进行校验 | |
@Pattern | 通过正则表达式进行校验 |
如果要开始校验规则,需要在接收数据的对象前面加上 @Validated 注解
三、分组校验
组是用 Java接口 来表示的,如下面的 增、删、改、查 四个组:
java">/*** 对校验类型进行分组*/
public class ValidationGroup {public interface Insert {} // 增public interface Delete {} // 删public interface Update {} // 改public interface Select {} // 查
}
每一个校验的注解上都有group属性,它可以为当前校验规则指定所属组,若不指定则为默认组, 如:
java">public class Student {// 默认组@NotNull private Long id;// 新增组、修改组@NotEmpty( groups = {ValidationGroup.Insert.class,ValidationGroup.Update.class} ) private String name;
}
当激活新增组校验或者修改组校验时,name属性将会进行不为空的校验,激活组校验可以通过@Validated注解的value属性指定,
如果不指定激活的组则激活默认组,此时id会进行不为null的校验
java">@RestController
public class StudentController {@PostMappingpublic void add( @Validated(value={ValidationGroup.Insert.class}) // 对新增组字段进行校验@RequestBody Student student) {// ...}
}
四、案例
这里我导入了lombok,不想导入也可以手动生成get、set方法、无参、全参构造
校验分组
java">/*** 对校验类型进行分组*/
public class ValidationGroup {public interface Insert {}public interface Delete {}public interface Update {}public interface Select {}
}
校验的实体类
java">import com.example.config.ValidationGroup;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import javax.validation.constraints.*;
import javax.validation.groups.Default;
import java.time.LocalDate;
import java.util.Date;@AllArgsConstructor
@NoArgsConstructor
@Data
public class Student {@NotNull(message = "id不能为空",groups = {ValidationGroup.Update.class, // 更新组ValidationGroup.Delete.class, // 删除组})private Long id;@Size(min = 1,max = 5,message = "姓名长度必须在1~5个字符")@NotEmpty(message = "姓名不能为空",groups = {ValidationGroup.Insert.class} // 新增组)private String name;@Min( value = 0,message = "年龄必须>=0",groups = ValidationGroup.Insert.class) // 新增组@Max(value = 120,message = "年龄超过了120岁",groups = {ValidationGroup.Insert.class}) // 新增组private Integer age;@Pattern( regexp = "\\d{4}(\\-|\\/|.)\\d{1,2}\\1\\d{1,2}",message = "生日格式必须是yyyy-MM-dd",groups = {ValidationGroup.Insert.class}) // 默认组private String birthday;@Email(message = "邮箱格式有误",groups = {ValidationGroup.Insert.class}) // 默认组private String email;
}
控制层
java">import com.example.config.ValidationGroup;
import com.example.model.Student;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;@RestController
@RequestMapping("/student")
public class StudentController {@PostMappingpublic String add(@Validated(ValidationGroup.Insert.class) // 对新增组字段校验@RequestBody Student student) {return "添加成功";}@PutMappingpublic String update(@Validated({ValidationGroup.Update.class}) // 对更新组字段校验@RequestBody Student student) {return "更新成功";}@DeleteMappingpublic String delete(@Validated(value={ValidationGroup.Delete.class}) // 对删除组字段校验@RequestBody Student student) {return "删除成功";}
}
希望通过SpringBoot的Validation校验能帮助小伙伴们解决大多数校验!