当前位置: 首页 > news >正文

JSR 303(即 Bean Validation)是一个通过​​注解在 Java Bean 上定义和执行验证规则​​的规范

🛠️ 一、JSR 303是什么?

JSR 303(Java Specification Requests 303)是Java EE 6的子规范,全称​​Bean Validation​​。它通过注解方式对JavaBean的属性值进行标准化校验,例如检查非空、长度、格式等规则。其参考实现是​​Hibernate Validator​​(与Hibernate ORM无关)

​核心价值​​:
✅ 将校验逻辑从业务代码剥离,提升代码可维护性
✅ 统一校验规则,避免重复编码
✅ 支持编译时和运行时校验,增强数据安全性(防止恶意绕过前端校验)


⚙️ 二、快速入门:基础使用

1️⃣ 环境搭建
  • ​Spring Boot项目​​:添加依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId>
</dependency>
  • ​非Spring项目​​:需手动引入validation-apihibernate-validator
2️⃣ 常用内置注解
注解适用类型说明示例
@NotNull任意值不能为null@NotNull(message="ID不能为空")
@NotBlankString非null且去除空格后长度>0@NotBlank(message="用户名必填")
@Size集合/String长度在指定范围内@Size(min=6, max=20, message="密码需6-20位")
@EmailString邮箱格式校验@Email(message="邮箱格式无效")
@PatternString正则表达式匹配@Pattern(regexp="^1[3-9]\\d{9}$", message="手机号格式错误")
@Min/@Max数字类型数值范围限制@Min(value=18, message="年龄需≥18")
3️⃣ 在Controller中使用

通过@Valid@Validated触发校验:

@PostMapping("/user")
public ResponseEntity<String> createUser(@Valid @RequestBody UserDTO user) {// 校验通过才执行业务逻辑return ResponseEntity.ok("创建成功");
}
  • 校验失败会抛出MethodArgumentNotValidException,需全局异常处理

⚡ 三、进阶技巧

1️⃣ 分组校验

解决同一字段在不同场景(如新增/修改)下的差异化校验需求:

// 定义分组接口
public interface AddGroup {}
public interface UpdateGroup {}// 实体类中使用
public class User {@Null(groups = AddGroup.class, message = "新增时ID必须为空")@NotNull(groups = UpdateGroup.class, message = "修改时ID不能为空")private Long id;
}// Controller指定分组
@PostMapping("/update")
public R update(@Validated(UpdateGroup.class) @RequestBody User user) {// ...
}

注:未分组的注解在分组校验中不生效

2️⃣ 自定义校验

​步骤​​:

  1. ​定义注解​​:
    @Target({ElementType.FIELD})
    @Retention(RetentionPolicy.RUNTIME)
    @Constraint(validatedBy = ListValueConstraintValidator.class)
    public @interface ListValue {String message() default "值不在可选范围内";Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};int[] vals() default {};  // 允许的值列表,如[0,1]
    }

  2. ​实现校验器​​:
    public class ListValueConstraintValidator implements ConstraintValidator<ListValue, Integer> {private Set<Integer> set = new HashSet<>();@Overridepublic void initialize(ListValue constraintAnnotation) {for (int val : constraintAnnotation.vals()) {set.add(val);}}@Overridepublic boolean isValid(Integer value, ConstraintValidatorContext context) {return set.contains(value);}
    }

  3. ​使用自定义注解​​:
    @ListValue(vals = {0, 1}, message = "状态只能是0或1")
    private Integer status;


💎 四、常见问题

  • ​Q:@Valid vs @Validated?​

    • @Valid(JSR标准):不支持分组,可嵌套校验字段。
    • @Validated(Spring扩展):支持分组,不可用于字段
  • ​Q:校验失败如何获取具体错误?​
    在Controller参数中添加BindingResult result,通过result.getFieldErrors()遍历错误详情

  • ​Q:为什么int类型推荐用Integer?​
    @Min等注解在基本类型(如int)上无法处理空值,而Integer可兼容null校验


📚 总结

JSR 303通过​​声明式注解​​简化数据校验。初学者可逐步掌握:
1️⃣ 基础注解 → 2️⃣ Controller集成 → 3️⃣ 分组/自定义校验 → 4️⃣ 全局异常处理
结合Spring生态(如Spring MVC)能极大提升开发效率和系统健壮性

更多实践参考:Hibernate Validator文档或Spring官方教程。

相关文章:

  • C++ 的四种强制类型转换:static_cast、dynamic_cast、const_cast 和 reinterpret_cast
  • LXQt修改开始菜单高亮
  • NW969NW978美光闪存颗粒NW980NW984
  • python连接邮箱的协议选择
  • fork函数小解
  • 学习笔记:3个学习AI路上反复看到的概念:RAG,Langchain,Agent
  • 二叉搜索树——红黑树
  • 投稿Cover Letter怎么写
  • 简单cnn
  • Deepin 20.9社区版安装Docker
  • c++第四课(基础c)——布尔变量
  • 深入Java性能调优:原理详解与实战
  • Linux基本指令/下
  • 【判断数字递增】2021-12-19
  • 第二章支线三 ·《CSS炼金术:动画与变换高级奥义》
  • 《重新定义高效微调:QLoRA 4位量化的颠覆式创新解析》
  • WIFI中2.4G和5G的区别,和WiFi5,WiFi6和WiFi7的区别,
  • 【七. Java字符串操作与StringBuilder高效拼接技巧】
  • transformer 输入三视图线段输出长宽高 笔记
  • SSM框架前后端网站显示不出来图片
  • 小男生和大人做av网站大全/公众号seo排名软件
  • 世界球队最新排名/优化大师官方正版下载
  • 网站着陆页是什么意思/app制作一个需要多少钱
  • 有自己网站做淘宝客赚钱吗/公众号排名优化软件
  • 南京网站建设学习/有没有专门帮人推广的公司
  • 门户类网站图片/怎么开通网站