spring-boot-JSR303

文章目录


一、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);

    }

测试

相关推荐
2601_949817722 小时前
C++指针与引用深度精讲:底层原理、差异对比与高阶实战陷阱
java·jvm·c++
va学弟2 小时前
Java 网络通信编程(10):Channel 和 Selector
java·开发语言
小张小张爱学习2 小时前
Apache Dubbo 3 + Spring Boot 3 多模块 Maven 项目,演示基于 Zookeeper 注册中心的 RPC 调用
java·dubbo
阿pin3 小时前
Java随笔-ConcurrentHashMap
java·开发语言·哈希算法
C+-C资深大佬4 小时前
Java 变量:从入门到精通
java·开发语言·python
Flittly4 小时前
【日常小问】Docker 部署 Nacos 2.4.3,Dubbo 3.3 连接 Config Service 失败排查
java·spring boot·dubbo
kuonyuma4 小时前
java之动态代理
java·开发语言
衔烛之龙14 小时前
Windows x64 构建 liboqs-java教程
java·windows·python
一路向北North4 小时前
Spring Security OAuth2.0(20):完善环境配置
java·后端·spring
Java面试题总结4 小时前
IntelliJ IDEA 从卡顿到起飞,只用改这些。。。
java·ide·intellij-idea