博客
关于我
springboot后端数据校验JSR303规范详解
阅读量:720 次
发布时间:2019-03-21

本文共 2662 字,大约阅读时间需要 8 分钟。

后端数据校验JSR303规范详解

本文内容说明:

  • JSR303是由JSR303定义的一组校验规范
  • Hibernate Validator为JSR303提供了一系列标准化校验注解
  • 支持自定义校验规则,主要通过正则表达式实现
  • 可以通过校验结果获取数据校验的详细信息
  • 获取Hibernate Validator的官方文档资源
  • 其他文章可参考编写JSR303分组校验和自定义注解校验相关内容
  • 提醒:前端校验是基础,后端校验是必需,建议结合全局异常捕获来实现数据安全校验。本文将先从基础校验和统一异常处理说起,其他文章可参考分组校验和自定义注解校验的内容。


    一:基础校验

    1、给bean添加注解

    需要注意:- 使用@NotEmpty时,对于非空对象(如字符串、集合等)的校验- 对于Integer类型,建议使用@NotNull,而不是@NotEmpty- 定义自定义校验规则时,可以通过@Pattern注解使用正则表达式- 不同的校验类型有不同的默认提示信息

    代码示例:

    // 示例1:@NotBlankpublic class UserDTO {    @NotBlank(message = "用户名不能为空")     private String username;}// 示例2:自定义正则校验public class BrandEntity {    @Pattern(regexp = "/^[a-zA-Z]$", message = "必须是a-z或A-Z字母")     private String firstLetter;}

    2、在Controller开启校验

    使用Hibernate Validator的校验注解需要在Controller方法上标注@Valid,同时将注解应用到需要校验的对象上

    public R save(@Valid @RequestBody BrandEntity brand) {    // 处理校验结果}

    3、接收校验结果

    通过BindingResult接收校验结果,可以获取校验失败时的具体错误信息

    public R save(@Valid @RequestBody BrandEntity brand, BindingResult result) {    if (result.hasErrors()) {        // 提取校验结果        Map errorMap = new HashMap<>();        result.getFieldErrors().forEach(item -> {            errorMap.put(item.getField(), item.getDefaultMessage());        });        return R.error(400, "数据校验失败").put("data", errorMap);    } else {        brandService.save(brand);        return R.ok();    }}

    4、常用校验注解

    校验类型 注解示例 默认提示信息 使用场景
    @NotBlank @NotBlank(message = "用户名不能为空") 字段内容不能为空(去除空格后的内容也为空) 适用于字符串类型字段
    @NotNull @NotNull(message = "ID不能为空") 字段不为空 适用于所有非空对象(如Integer、String等)
    @Size @Size(min=5, max=10, message = "长度必须在5-10之间") 字段长度在min和max之间 适用于数组、集合、字符串等类型
    @Future @Future(message = "日期必须在未来") 日期必须在当前时间之后 适用于DateCalendar对象
    @Pattern @Pattern(regexp = "^\\d{3}-\\d{4}-\\d{4}$", message = "格式错误") 是否符合正则表达式 定义自定义格式规则

    5、自定义校验规则

    可通过@Pattern注解定义自定义正则表达式,实现对字段格式的更精细控制

    示例:

    ```java@Pattern(regexp = "^\\d{3}-\\d{4}-\\d{4}$", message = "文件格式不正确")private String fileFormat;```

    6、校验默认提示信息

    默认提示信息分为英文和中文版本,英文提示信息来源于Hibernate Validator的默认提示,中文提示信息需单独配置

    图片1:Hibernate Validator提示信息配置

    7、异常处理

    推荐在Controller层配置全局异常处理类,统一处理MethodArgumentNotValidException异常

    ```javapackage com.guli.common.exception;public enum BizCodeEnum { VALID_EXCEPTION(400, "参数校验失败"), UNKNOW_EXCEPTION(500, "系统未知错误");
    private int code;private String msg;BizCodeEnum(int code, String msg) {    this.code = code;    this.msg = msg;}public int getCode() {    return code;}public String getMsg() {    return msg;}

    }

    图片2:全局异常捕获配置

    8、配置依赖关系

    确保在Spring Boot项目中配备了Hibernate Validator相关依赖

    ```xml
    org.springframework.boot
    spring-boot-starter-validation

    总结

    JSR303规范为后端校验提供了统一的标准,Hibernate Validator是实现JSR303校验的最佳选择。推荐在Controller层开启校验,结合BindingResult接收校验结果,并通过全局异常捕获统一处理校验失败的情况。

    转载地址:http://lprrz.baihongyu.com/

    你可能感兴趣的文章
    NIFI1.21.0_Mysql到Mysql增量CDC同步中_补充_更新时如果目标表中不存在记录就改为插入数据_Postgresql_Hbase也适用---大数据之Nifi工作笔记0059
    查看>>
    NIFI1.21.0_NIFI和hadoop蹦了_200G集群磁盘又满了_Jps看不到进程了_Unable to write in /tmp. Aborting----大数据之Nifi工作笔记0052
    查看>>
    NIFI1.21.0_Postgresql和Mysql同时指定库_指定多表_全量同步到Mysql数据库以及Hbase数据库中---大数据之Nifi工作笔记0060
    查看>>
    NIFI1.21.0最新版本安装_连接phoenix_单机版_Https登录_什么都没改换了最新版本的NIFI可以连接了_气人_实现插入数据到Hbase_实际操作---大数据之Nifi工作笔记0050
    查看>>
    NIFI1.21.0最新版本安装_配置使用HTTP登录_默认是用HTTPS登录的_Https登录需要输入用户名密码_HTTP不需要---大数据之Nifi工作笔记0051
    查看>>
    NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增删改数据分发及删除数据实时同步_通过分页解决变更记录过大问题_02----大数据之Nifi工作笔记0054
    查看>>
    NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增加修改实时同步_使用JsonPath及自定义Python脚本_03---大数据之Nifi工作笔记0055
    查看>>
    NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_插入修改删除增量数据实时同步_通过分页解决变更记录过大问题_01----大数据之Nifi工作笔记0053
    查看>>
    NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表或全表增量同步_实现指定整库同步_或指定数据表同步配置_04---大数据之Nifi工作笔记0056
    查看>>
    NIFI1.23.2_最新版_性能优化通用_技巧积累_使用NIFI表达式过滤表_随时更新---大数据之Nifi工作笔记0063
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_根据binlog实现update数据实时同步_实际操作05---大数据之Nifi工作笔记0044
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_根据binlog实现数据实时delete同步_实际操作04---大数据之Nifi工作笔记0043
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置binlog_使用处理器抓取binlog数据_实际操作01---大数据之Nifi工作笔记0040
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_实现数据插入数据到目标数据库_实际操作03---大数据之Nifi工作笔记0042
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_生成插入Sql语句_实际操作02---大数据之Nifi工作笔记0041
    查看>>
    NIFI从MySql中离线读取数据再导入到MySql中_03_来吧用NIFI实现_数据分页获取功能---大数据之Nifi工作笔记0038
    查看>>
    NIFI从MySql中离线读取数据再导入到MySql中_不带分页处理_01_QueryDatabaseTable获取数据_原0036---大数据之Nifi工作笔记0064
    查看>>
    NIFI从MySql中离线读取数据再导入到MySql中_无分页功能_02_转换数据_分割数据_提取JSON数据_替换拼接SQL_添加分页---大数据之Nifi工作笔记0037
    查看>>
    NIFI从Oracle11G同步数据到Mysql_亲测可用_解决数据重复_数据跟源表不一致的问题---大数据之Nifi工作笔记0065
    查看>>
    NIFI从PostGresql中离线读取数据再导入到MySql中_带有数据分页获取功能_不带分页不能用_NIFI资料太少了---大数据之Nifi工作笔记0039
    查看>>