JSR303分组校验属于后端校验的一种很方便的方式
步骤:

1.新建两个接口,用来代表哪两个组,比如,AddGroup,UpdateGroup代表添加分组和修改分组

//添加分组
package com.jc.common.valid;public interface AddGroup {}//修改分组
package com.jc.common.valid;public interface UpdateGroup {}

2.给需要验证的实体类的字段上添加对应的校验注解,并且指定其分组

package com.jc.gulimall.product.entity;import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;import java.io.Serializable;
import java.util.Date;import com.jc.common.valid.AddGroup;
import com.jc.common.valid.UpdateGroup;
import lombok.Data;
import org.hibernate.validator.constraints.URL;import javax.validation.constraints.*;/*** 品牌* * @author wjc* @email 1678912421@gmail.com* @date 2021-07-16 21:22:32*/
@Data
@TableName("pms_brand")
public class BrandEntity implements Serializable {private static final long serialVersionUID = 1L;/*** 品牌id*/@NotNull(message = "修改必须指定品牌id",groups = {UpdateGroup.class})@Null(message = "添加不能添加品牌id",groups = {AddGroup.class})@TableIdprivate Long brandId;/*** 品牌名*/@NotBlank(message = "品牌名不能为空!")private String name;/*** 品牌logo地址*/@URL(message = "logo地址必须是一个合法的URL!",groups = {AddGroup.class,UpdateGroup.class})@NotNull(message = "logo不能为空!",groups = {AddGroup.class,UpdateGroup.class})private String logo;/*** 介绍*/private String descript;/*** 显示状态[0-不显示;1-显示]*/private Integer showStatus;/*** 检索首字母*/@NotNull(message = "首字母不能为空!",groups = {AddGroup.class,UpdateGroup.class})@Pattern(regexp = "/^[a-zA-Z]$/",message = "检索首字符必须是一个字母",groups = {AddGroup.class,UpdateGroup.class})private String firstLetter;/*** 排序*/@NotNull(message = "排序字段不能为空!",groups = {AddGroup.class,UpdateGroup.class})@Min(value = 0,message = "排序必须大于等于0",groups = {AddGroup.class,UpdateGroup.class})private Integer sort;}

上边的logo,firstLetter,sort字段我都添加了两个分组,也就是说在修改和添加的情况下都会校验

3.在url对应的方法参数中需要校验的实体类前加上@Validated(AddGroup.class)注解,在需要校验的实体类中标注AddGroup分组的字段进行校验,@Validated注解后边不指定分组类别,则默认是对不标注分组的字段进行校验

 //对BrandEntity 字段中指定UpdaGroup分组的字段就行校验 @RequestMapping("/update")public R update(@Validated(UpdateGroup.class) @RequestBody BrandEntity brand){brandService.updateByid(brand);return R.ok();}@RequestMapping("/save")public R save(@Validated(AddGroup.class) @RequestBody BrandEntity brand/*, BindingResult bindingResult*/){//    统一异常处理
//            if (bindingResult.hasErrors()){//                Map<String,String> map = new HashMap<>();
//                bindingResult.getFieldErrors().stream().forEach((item)->{//                    String defaultMessage = item.getDefaultMessage();
//                    String field = item.getField();
//                    map.put(field,defaultMessage);
//                });
//                return R.error(400,"提交的数据不合法").put("data",map);
//            }brandService.save(brand);return R.ok();}

实践:
在save请求中,对实体类标注了AddGroup分组,则对实体类中所有标注AddGroup的分组就行校验,
对应上边的也就是,

 @Null(message = "添加不能添加品牌id",groups = {AddGroup.class})private Long brandId;@NotNull(message = "首字母不能为空!",groups = {AddGroup.class,UpdateGroup.class})@Pattern(regexp = "/^[a-zA-Z]$/",message = "检索首字符必须是一个字母",groups = {AddGroup.class,UpdateGroup.class})private String firstLetter;/*** 排序*/@NotNull(message = "排序字段不能为空!",groups = {AddGroup.class,UpdateGroup.class})@Min(value = 0,message = "排序必须大于等于0",groups = {AddGroup.class,UpdateGroup.class})private Integer sort;@URL(message = "logo地址必须是一个合法的URL!",groups = {AddGroup.class,UpdateGroup.class})@NotNull(message = "logo不能为空!",groups = {AddGroup.class,UpdateGroup.class})private String logo;


下面我们再看没有标注任何分组的字段,也就是name字段

 @NotBlank(message = "品牌名不能为空!")private String name;

我们将BrandController中的update方法中分组去掉原来是@Validated(updateGroup.class)

    @RequestMapping("/update")public R update(@Validated @RequestBody BrandEntity brand){brandService.updateByid(brand);return R.ok();}

由于除了name之外的字段都标注了分组,所以name之外的字段是不进行校验的,只有没有标注分组的name字段才进行校验。

总结:
在需要校验的实体类中,哪个字段标注了哪个分组,就在方法参数注解中指定校验分组的情况下进行校验。
字段没有标注分组的情况下,就在方法参数注解中没指定校验分组的情况下进行校验。

JSR303分组校验相关推荐

  1. JSR303数据校验(分组校验)

    分组校验应用场景: 添加操作时不需要指定实体类的id 修改操作时需要指定实体类的id 1.建两个接口,作为添加及修改的标识 2.在使用JSR303注解时添加group属性 3.在添加及编辑操作时使用@ ...

  2. Spring 使用 JSR303自定义校验注解+分组校验

    我们有这样一个需求,想要校验一个int类型的变量,校验它的值必须为我们所指定的值,且在修改状态分组时生效. @ListValue(vals = {0, 1}, groups = {UpdateStat ...

  3. 品牌管理-JSR303数据校验

    JSR303 1).给Bean添加校验注解:javax.validation.constraints,并定义自己的message提示 2).开启校验功能@Valid效果:校验错误以后会有默认的响应: ...

  4. hibernate-validate如何校验controller+service+分组校验+自定义注解实现校验规则等

    配置参数启动时校验 如果配置文件没有相关的配置,那么**启动时**就会出现以下异常: Description:Binding to target com.toby.provide.Applicatio ...

  5. validation 分组校验注解大全及使用详解

    JSR303(Bean的校验框架)的注解,在 controller 的方法中验证时(运行时校验属性)使用,如果不合法(校验失败),注解中的提示信息会保存在 result 中. JSR提供的校验注解: ...

  6. 【全网最全】JSR303参数校验与全局异常处理(从理论到实践别用if判断参数了)

    一.前言 我们在日常开发中,避不开的就是参数校验,有人说前端不是会在表单中进行校验的吗?在后端中,我们可以直接不管前端怎么样判断过滤,我们后端都需要进行再次判断, 为了安全 .因为前端很容易拜托,当测 ...

  7. JSR303参数校验(2)

    前言:之前咱们讲解了什么是JSR303,并且使用他的实现Hibernate Validator做了简单的参数校验,并且通过BindingResult获取到了出现异常的信息并返回给了前端,这样大大简化了 ...

  8. JSR303数据校验介绍和使用

    1.介绍: JSR全称Java Specification Requests,即Java 规范提案,有很多的JSR校验,JSR就是一种java标准,JSR 303是其中的一种 2.为什么要使用JSR3 ...

  9. 谷粒商城-品牌管理-JSR303数据校验

    后端在处理前端传过来的数据时,尽管前端表单已经加了校验逻辑,但是作为严谨考虑,在后端对接口传输的数据做校验也必不可少. 开启校验: 实体类上增加校验注解,接口参数前增加@Valid 开启校验 pack ...

最新文章

  1. 《面向对象分析与设计》读书笔记——第一章 复杂性
  2. .NET分层登陆——机房收费系统再总结
  3. 岛屿的个数number-of-islands
  4. 大话设计模式—单例模式
  5. 使用promise解决回调地狱_「每日一题」Promise 是什么?
  6. python接口自动化测试一:http协议
  7. .Net框架集WebClient类向WinCE平台上传文件(FTP方式)延迟15秒释疑
  8. 揭秘《虚拟化与云计算》
  9. Linux(CentOS) 下安装字体
  10. 快速去除PDF的打开密码和限制(四种方法)
  11. 小程序应用 饿了么美团外卖cps领券返利小程序+前端(带三级分销裂变)
  12. c++ set用法详解
  13. thinkphp5.1+workman+jsonRpc
  14. 如何在unity上放置3d图片
  15. 转:成功者的第四个特征,如何与他人打交道?
  16. Java+JSP+Mysql+Tomcat实现Web图书管理系统
  17. Z世代偏爱怀旧IP,B站UP主不可忽视的流量蓝海
  18. 三阶魔方还原 two phase 算法 学习笔记
  19. webug4.0靶场之越权查看admin
  20. Sqlite3 C++ 使用方法

热门文章

  1. 帮宝宝睡得更好、更平稳
  2. 如何开启服务器2003远程,windows2003远程界面如何开启3389端口
  3. 跨站点脚本 (XSS)
  4. ENVI提取NDVI与植被覆盖度估算
  5. Codeforces Round #309 (Div. 1)D. Nudist Beach 二分+bfs
  6. 【USACO3.1.6】邮票 动态规划/滚动数组
  7. 手放开游戏(擦衣服游戏)项目源码
  8. 聚类——标签传播算法以及Python实现
  9. 编程中变量命名方法:驼峰命名法?
  10. 数据分析-------统计学-------假设检验和p值、单侧检验、双侧检验、z统计量、t统计量、第一类错误、第二类错误