JSR303分组校验
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分组校验相关推荐
- JSR303数据校验(分组校验)
分组校验应用场景: 添加操作时不需要指定实体类的id 修改操作时需要指定实体类的id 1.建两个接口,作为添加及修改的标识 2.在使用JSR303注解时添加group属性 3.在添加及编辑操作时使用@ ...
- Spring 使用 JSR303自定义校验注解+分组校验
我们有这样一个需求,想要校验一个int类型的变量,校验它的值必须为我们所指定的值,且在修改状态分组时生效. @ListValue(vals = {0, 1}, groups = {UpdateStat ...
- 品牌管理-JSR303数据校验
JSR303 1).给Bean添加校验注解:javax.validation.constraints,并定义自己的message提示 2).开启校验功能@Valid效果:校验错误以后会有默认的响应: ...
- hibernate-validate如何校验controller+service+分组校验+自定义注解实现校验规则等
配置参数启动时校验 如果配置文件没有相关的配置,那么**启动时**就会出现以下异常: Description:Binding to target com.toby.provide.Applicatio ...
- validation 分组校验注解大全及使用详解
JSR303(Bean的校验框架)的注解,在 controller 的方法中验证时(运行时校验属性)使用,如果不合法(校验失败),注解中的提示信息会保存在 result 中. JSR提供的校验注解: ...
- 【全网最全】JSR303参数校验与全局异常处理(从理论到实践别用if判断参数了)
一.前言 我们在日常开发中,避不开的就是参数校验,有人说前端不是会在表单中进行校验的吗?在后端中,我们可以直接不管前端怎么样判断过滤,我们后端都需要进行再次判断, 为了安全 .因为前端很容易拜托,当测 ...
- JSR303参数校验(2)
前言:之前咱们讲解了什么是JSR303,并且使用他的实现Hibernate Validator做了简单的参数校验,并且通过BindingResult获取到了出现异常的信息并返回给了前端,这样大大简化了 ...
- JSR303数据校验介绍和使用
1.介绍: JSR全称Java Specification Requests,即Java 规范提案,有很多的JSR校验,JSR就是一种java标准,JSR 303是其中的一种 2.为什么要使用JSR3 ...
- 谷粒商城-品牌管理-JSR303数据校验
后端在处理前端传过来的数据时,尽管前端表单已经加了校验逻辑,但是作为严谨考虑,在后端对接口传输的数据做校验也必不可少. 开启校验: 实体类上增加校验注解,接口参数前增加@Valid 开启校验 pack ...
最新文章
- 《面向对象分析与设计》读书笔记——第一章 复杂性
- .NET分层登陆——机房收费系统再总结
- 岛屿的个数number-of-islands
- 大话设计模式—单例模式
- 使用promise解决回调地狱_「每日一题」Promise 是什么?
- python接口自动化测试一:http协议
- .Net框架集WebClient类向WinCE平台上传文件(FTP方式)延迟15秒释疑
- 揭秘《虚拟化与云计算》
- Linux(CentOS) 下安装字体
- 快速去除PDF的打开密码和限制(四种方法)
- 小程序应用 饿了么美团外卖cps领券返利小程序+前端(带三级分销裂变)
- c++ set用法详解
- thinkphp5.1+workman+jsonRpc
- 如何在unity上放置3d图片
- 转:成功者的第四个特征,如何与他人打交道?
- Java+JSP+Mysql+Tomcat实现Web图书管理系统
- Z世代偏爱怀旧IP,B站UP主不可忽视的流量蓝海
- 三阶魔方还原 two phase 算法 学习笔记
- webug4.0靶场之越权查看admin
- Sqlite3 C++ 使用方法
热门文章
- 帮宝宝睡得更好、更平稳
- 如何开启服务器2003远程,windows2003远程界面如何开启3389端口
- 跨站点脚本 (XSS)
- ENVI提取NDVI与植被覆盖度估算
- Codeforces Round #309 (Div. 1)D. Nudist Beach 二分+bfs
- 【USACO3.1.6】邮票 动态规划/滚动数组
- 手放开游戏(擦衣服游戏)项目源码
- 聚类——标签传播算法以及Python实现
- 编程中变量命名方法:驼峰命名法?
- 数据分析-------统计学-------假设检验和p值、单侧检验、双侧检验、z统计量、t统计量、第一类错误、第二类错误