一、引入依赖
<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接口 来表示的,如下面的 增、删、改、查 四个组:
/**
* 对校验类型进行分组
*/
public class ValidationGroup {
public interface Insert {} // 增
public interface Delete {} // 删
public interface Update {} // 改
public interface Select {} // 查
}
每一个校验的注解上都有group属性,它可以为当前校验规则指定所属组,若不指定则为默认组, 如:
public class Student {
// 默认组
@NotNull
private Long id;
// 新增组、修改组
@NotEmpty( groups = {ValidationGroup.Insert.class,ValidationGroup.Update.class} )
private String name;
}
当激活新增组校验或者修改组校验时,name属性将会进行不为空的校验,激活组校验可以通过@Validated注解的value属性指定,
如果不指定激活的组则激活默认组,此时id会进行不为null的校验
@RestController
public class StudentController {
@PostMapping
public void add( @Validated(value={ValidationGroup.Insert.class}) // 对新增组字段进行校验
@RequestBody Student student)
{
// ...
}
}
四、案例
这里我导入了lombok,不想导入也可以手动生成get、set方法、无参、全参构造
校验分组
/**
* 对校验类型进行分组
*/
public class ValidationGroup {
public interface Insert {}
public interface Delete {}
public interface Update {}
public interface Select {}
}
校验的实体类
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;
}
控制层
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 {
@PostMapping
public String add(@Validated(ValidationGroup.Insert.class) // 对新增组字段校验
@RequestBody Student student) {
return "添加成功";
}
@PutMapping
public String update(@Validated({ValidationGroup.Update.class}) // 对更新组字段校验
@RequestBody Student student) {
return "更新成功";
}
@DeleteMapping
public String delete(@Validated(value={ValidationGroup.Delete.class}) // 对删除组字段校验
@RequestBody Student student) {
return "删除成功";
}
}
希望通过SpringBoot的Validation校验能帮助小伙伴们解决大多数校验!