文章目录
- 一、JSR303是什么?
- 二、使用步骤
- 三.实战
-
- 3.1常见注解
- [3.2 用法](#3.2 用法)
- 四.高级用法-分组校验
一、JSR303是什么?
JSR 303 的全称为 Bean Validation,是 Java EE(现为 Jakarta EE)中用于定义和实现 JavaBean 数据合法性校验的标准规范。它旨在提供一套统一的、基于注解的数据验证机制,使得开发者无需编写大量样板代码,即可对 Java 对象中的字段进行合法性校验。
二、使用步骤
1.引入依赖
java
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.6.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
<version>2.3.2.RELEASE</version>
</dependency>
2.实体类
java
package com.springcloud.domain;
import java.io.Serializable;
import java.util.Date;
import com.springcloud.Valid.AddGroup;
import com.springcloud.Valid.UpdateGroup;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Null;
/**
* 品牌
*
* @author liurui
* @email liurui@gmail.com
* @date 2023-10-18 13:34:55
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class BrandEntity implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 品牌id
*/
private Long brandId;
/**
* 品牌名
*/
private String name;
/**
* 品牌logo地址
*/
private String logo;
/**
* 介绍
*/
private String descript;
/**
* 显示状态[0-不显示;1-显示]
*/
private Integer showStatus;
/**
* 检索首字母
*/
private String firstLetter;
/**
* 排序
*/
private Integer sort;
}
三.实战
3.1常见注解
validation提供了非常多的校验注解,我们只选择几个常用的进行讲解,其他的都是一样的思路。如果需要了解这些注解可以导入以下依赖:
java
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>

3.2 用法
我们以 @NotNull 为例,只需要在对应字段上方加上这个注解,则这个字段就说明不能为空

测试:
在测试中我们需要再里边加入@Valid表明我们对接受的字段进行校验操作,如果不加会不生效
java
@RequestMapping("/getInfo")
public R getBrand(@Valid @RequestBody BrandEntity brandEntity){
return R.ok().put("data",brandEntity);
}
不加注解后的效果:

加了注解后:

但是有时候我们想自定义校验失败的错误信息,那就用到了message字段。
java
@NotNull(message = "品牌名必须提交")
private String name;
测试方法:
java
**
* @NotBlank(message = "介绍不能为空")可以自定义校验信息
* BindingResult result 封装了前边的校验结果
* **/
@RequestMapping("/getInfo2")
public R getBrand2(@Valid @RequestBody BrandEntity brandEntity , BindingResult result){
/**
* result.hasErrors()判断是否校验错误
* **/
Map<String,String> map=new HashMap<>();
if(result.hasErrors()){
//获取校验的错误结果
List<FieldError> fieldErrors = result.getFieldErrors();
for(FieldError fe:fieldErrors){
//获取错误字段
String field = fe.getField();
//获取错误信息
String defaultMessage = fe.getDefaultMessage();
map.put(field,defaultMessage);
}
}
return R.ok().put("data",brandEntity).put("data",map);
}

四.高级用法-分组校验
使用场景
在日常开发中我们对于同一个实体类,在新增和修改的时候有可能对属性的要求不一样,比如对于品牌ID,在新增的时候我们不需要提供,但是在修改的时候我们比如要求提供。
实战
1.创建两个分组校验接口
java
package com.springcloud.Valid;
public interface AddGroup {
}
java
package com.springcloud.Valid;
public interface UpdateGroup {
}
在属性上我们新增group字段
java
/**
* 品牌id
*/
@Null(message = "新增不允许携带brandId",groups = {AddGroup.class} )
@NotNull(message = "修改必须携带brandId",groups = {UpdateGroup.class})
private Long brandId;
/**
* 品牌名
*/
@NotNull(message = "品牌名必须提交",groups = {UpdateGroup.class, AddGroup.class})
//@NotNull(message = "品牌名必须提交")
private String name;
测试
- @Validated({AddGroup.class}):在执行参数校验时,只触发属于 AddGroup 这个特定分组(Group)的校验规则,而忽略其他分组的规则。
java
/**
*JSR303分组校验 groups
* 同一个字段,在不同业务场景下,校验规则往往不一样
* 比如brandId我们在新增的时候是不允许携带的因为是自增的,修改的时候这个也是必须要带的
* 还有name,不管是新增还是修改,都必须要携带的
* Validated:指定校验分组
* **/
@RequestMapping("/save")
public R save(@Validated({AddGroup.class}) @RequestBody BrandEntity brandEntity, BindingResult result){
Map<String,String> map=new HashMap<>();
if(result.hasErrors()){
//获取校验的错误结果
List<FieldError> fieldErrors = result.getFieldErrors();
for(FieldError fe:fieldErrors){
//获取错误字段
String field = fe.getField();
//获取错误信息
String defaultMessage = fe.getDefaultMessage();
map.put(field,defaultMessage);
}
return R.error(400, CodeEnum.LOGIN_ERROR_CODE.getMessage()).put("data",map);
}
return R.ok().put("data",brandEntity);
}
测试
