1.介绍:

JSR全称Java Specification Requests,即Java 规范提案,有很多的JSR校验,JSR就是一种java标准,JSR 303是其中的一种

2.为什么要使用JSR303进行后端校验?

其实校验功能前端就可以帮我们完成,为什么还要就行后端校验呢?例如Vue进行前端校验

dataRule: {name: [{ required: true, message: "品牌名不能为空", trigger: "blur" }],logo: [{ required: true, message: "品牌logo地址不能为空", trigger: "blur" },],descript: [{ required: true, message: "介绍不能为空", trigger: "blur" },],showStatus: [{type:'number',required: true,message: "[0-不显示;1-显示]",trigger: "blur",},],firstLetter: [{pattern:/^[a-zA-Z]$/, required: true, message: "检索首字母必须a-z或A-Z", trigger: "blur"  },],sort: [{ required: true, message: "排序不能为空", trigger: "blur" }],},};

我们可以有很多方式绕过前端验证:比如postman,这样就会出现问题了

前端验证的showStatus只有0和1两个值,通过postman输入5也可以成功,所以需要后端验证

 3.使用

JSR303
 1)、给Bean添加校验注解:javax.validation.constraints,并定义自己的message提示
 2)、开启校验功能@Valid
    效果:校验错误以后会有默认的响应;
 3)、给校验的参数bean后紧跟一个BindingResult,就可以获取到校验的结果
 4)、分组校验(多场景的复杂校验)
       1)、    @NotBlank(message = "品牌名必须提交",groups = {AddGroup.class,UpdateGroup.class})
        给校验注解标注什么情况需要进行校验
       2)、@Validated({AddGroup.class})
       3)、默认没有指定分组的校验注解@NotBlank,在分组校验情况@Validated({AddGroup.class})下不生效,只会在@Validated生效;
 5)、自定义校验
    1)、编写一个自定义的校验注解
    2)、编写一个自定义的校验器 ConstraintValidator
    3)、关联自定义的校验器和自定义的校验注解

实体类上增加校验注解,接口参数前增加@Valid 开启校验

@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 = "品牌名必须提交", groups = {AddGroup.class, UpdateGroup.class})private String name;/*** 品牌logo地址*/@NotBlank(groups = {AddGroup.class})@URL(message = "logo必须是一个合法的url地址", groups = {AddGroup.class, UpdateGroup.class})private String logo;/*** 介绍*/private String descript;/*** 显示状态[0-不显示;1-显示]*/
//  @Pattern()@NotNull(groups = {AddGroup.class, UpdateStatusGroup.class})@ListValue(vals = {0, 1}, groups = {AddGroup.class, UpdateStatusGroup.class})private Integer showStatus;/*** 检索首字母*/@NotEmpty(groups = {AddGroup.class})@Pattern(regexp = "^[a-zA-Z]$", message = "检索首字母必须是一个字母", groups = {AddGroup.class, UpdateGroup.class})private String firstLetter;/*** 排序*/@NotNull(groups = {AddGroup.class})@Min(value = 0, message = "排序必须大于等于0", groups = {AddGroup.class, UpdateGroup.class})private Integer sort;
}
@RequestMapping("/save")
//@RequiresPermissions("product:brand:save")
public R save(@Validated({AddGroup.class}) @RequestBody BrandEntity brand/*,BindingResult result*/) {brandService.save(brand);return R.ok();
}

自定义校验注解和校验器

1)自定义校验注解

@Documented
@Constraint(validatedBy = {ListValueConstraintValidator.class})
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})
@Retention(RUNTIME)
public @interface ListValue {String message() default "{cn.nlg.gulimall.common.valid.ListValue.message}";Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};int[] values() default {};
}

2)自定义校验器

public class ListValueConstraintValidator implements ConstraintValidator<ListValue, Integer> {private final Set<Integer> set = new HashSet<>();/*** 初始化方法* 参数:自定义注解的详细信息*/@Overridepublic void initialize(ListValue constraintAnnotation) {int[] values = constraintAnnotation.values();for (int val : values) {set.add(val);}}/*** 判断是否校验成功** @param value   需要校验的值* @param context* @return*/@Overridepublic boolean isValid(Integer value, ConstraintValidatorContext context) {return set.contains(value);}
}

创建校验信息提示配置文件

cn.nlg.gulimall.common.valid.ListValue.message=必须提交指定的值

JSR303数据校验介绍和使用相关推荐

  1. java学习笔记——springmvc 之 数据自定义转换器 数据格式化 JSR303数据校验返回与接收JSON(@RequestBody 和 @ResponseBody)

    九.数据绑定流程分析 1.提出问题 日期字符串格式的表单参数,提交后转换为Date类型 <!--    解决问题: 1.数据类型转换 2.数据格式 3.数据校验 --> BirthDay ...

  2. JSR-303数据校验

    JSR-303数据校验 1.JSR-303数据校验简介 2.常用校验注解 3.使用 3.1 导入依赖 3.2 添加注解 3.3 测试 4.实战项目中用到实例 1.JSR-303数据校验简介 JSR是J ...

  3. JSR303数据校验方法

    使用JSR303做后台数据校验是有效确保非法数据绕过前端提交数据,必须确保数据的有效性和准确性.方法步骤如下: 一.引入依赖 <dependency><groupId>org. ...

  4. JSR303数据校验快速入门

    一.初步了解 (1)给Bean添加校验注解( javax.validation.constraints.*),并定义自己的message提示信息 查看有哪些校验注解: 查看校验信息:快速按shift键 ...

  5. JSR303数据校验-2021新版

    第一步 导入数据校验的jar包 <dependency><groupId>org.springframework.boot</groupId><artifac ...

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

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

  7. JSR-303 数据校验学习

    @ConfigurationProperties标识的类支持JSR-303校验 JSR 303 - Bean Validation 介绍及最佳实践 一.JSR-303简介 JSR-303 是 JAVA ...

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

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

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

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

最新文章

  1. ios jenkins配置_Jenkins + TestNG 实现自助式自动化测试平台
  2. 9个妙招增强家庭WIFI信号
  3. python助教的面试题_六个Python经典面试题(附详解)
  4. leetcode43. 字符串相乘 经典大数+和*
  5. 【python】输出到文件, f.write与print
  6. SQL 中的 in 与 not in、exists 与 not exists 的区别以及性能分析
  7. visio 输出mysql_Visio2010建立ER图并直接导出为SQL语句
  8. linux tuxedo查看服务进程数,Tuxedo 运行监控命令
  9. 网吧服务器系统如何配置,网吧服务器系统配置
  10. ADB安装 apk 时,安装失败
  11. How browsers work----Introduction
  12. 树莓派 pcf8591 AD转换模块使用
  13. win10子系统ubuntu文件夹位置_Win10 Linux子系统任何直接访问文件
  14. sqlite 导出CSV,身份证号码显示科学计数法
  15. 绿色手动安装MySQL数据库
  16. 王译潇20162314 实验报告四
  17. Channel 9视频整理【1】
  18. 渗透测试-信息打点(红队工具篇)
  19. 千兆上网行为管理路由评测
  20. C++ STL(第二十篇:算法-- 排序)

热门文章

  1. 物联网在智慧农业中的应用
  2. 分享一款办公辅助工具 迅捷文档转换
  3. 批量采集发布自媒体文章到wp等博客网站
  4. pdf文件没有加密保护,仍然不能编辑的解决办法
  5. 一个清华学生留学香港后对人生的思考(转)
  6. 计算夏普 The Sharpe ratio
  7. 通俗理解 mysql 的mvcc机制
  8. 沃尔玛获得区块链医疗记录系统专利
  9. 系统分析与设计学习笔记(六)包图
  10. 论文查重后会不会被泄露?