谷粒商城实战踩坑笔记-JSR303

一,学习JSR303时,因为Spring版本和视频不一致,导致踩坑。

主要有下面2个变化点:

springboot2.3.0以上需要手动引入依赖:

<!-- JSR303校验-->
 <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-validation</artifactId>
     <version>2.6.11</version>
 </dependency>

还需要在模块配置文件application.yml进行配置

server:
  error: #303校验错误信息提示
    include-binding-errors: always
    include-message: always

随着Spring Boot的不断发展和演进,某些组件和技术的选择也随之改变。本文将探讨Spring Boot为何在某一版本之后不再默认集成JSR 303(Bean Validation API),以及这一变化背后的原因、具体版本及相应的解决方案。

什么是JSR 303

JSR 303(Java Specification Request 303)是Bean Validation API的一个版本,定义了用于Java Bean属性校验的标准注解。这些注解可以用来验证对象的状态,例如确保一个字段不是空的或符合特定的格式。

Spring Boot与JSR 303的关系

Spring Boot在早期版本中默认集成了Bean Validation API(即JSR 303)。这意味着开发者无需显式添加依赖即可在实体类中使用诸如@NotNull, @Size, @Pattern等注解来进行数据校验。

原因分析

随着Java生态系统的发展,Spring Boot团队决定不再默认集成JSR 303,主要原因如下:

  1. 减少默认依赖:为了减小项目的启动体积和提高灵活性,Spring Boot逐渐移除了一些默认集成的组件,以降低项目的启动门槛。
  2. 社区标准变化:随着Java 8的发布,Bean Validation API被更新到了JSR 349,并且在Java 8及更高版本中成为标准的一部分。Spring Boot团队决定跟随社区标准的变化。
  3. 兼容性考虑:Spring Boot的更新需要考虑到与新版本Java的兼容性。随着Java 8及更高版本的广泛采用,Bean Validation API成为标准的一部分,因此Spring Boot不再需要默认集成它。

版本信息

具体的版本号可能会有所变化,但根据Spring Boot的发展趋势,大约在2.3.x版本左右,Spring Boot开始不再默认集成JSR 303。

解决方案

如果你正在使用Spring Boot 2.3.x或更高版本,并且希望使用Bean Validation API进行数据校验,你需要显式添加相关依赖。

  1. 添加依赖
    为了使用Bean Validation API,你需要在项目中添加Hibernate Validator的依赖。Hibernate Validator是Bean Validation API的一个流行实现。

    Maven配置:

    <dependency>
        <groupId>org.hibernate.validator</groupId>
        <artifactId>hibernate-validator</artifactId>
        <version>6.2.0.Final</version> <!-- 请使用最新版本 -->
    </dependency>
    

    Gradle配置:

    implementation 'org.hibernate.validator:hibernate-validator:6.2.0.Final' // 请使用最新版本
    
  2. 使用注解
    添加依赖后,你可以在实体类中使用Bean Validation API注解来进行数据校验。

    示例代码:

    import javax.validation.constraints.*;
    
    public class Brand {
        @NotBlank(message = "品牌名必须提交")
        private String name;
    
        @URL(message = "Logo必须是一个合法的URL地址")
        @NotEmpty(message = "Logo不能为空")
        private String logo;
    
        @Pattern(regexp = "[a-zA-Z]", message = "检索首字母必须是一个字母")
        private String firstLetter;
    
        @Min(value = 0, message = "排序必须大于等于0")
        private Integer sort;
    
        // getters and setters
    }
    
  3. 启用校验
    在Controller方法中,需要使用@Valid注解来开启校验功能,并使用BindingResult来获取校验结果。

    示例代码:

    @PostMapping("/save")
    public ResponseEntity<?> save(@Valid Brand brand, BindingResult bindingResult) {
        if (bindingResult.hasErrors()) {
            Map<String, String> errors = new HashMap<>();
            for (FieldError error : bindingResult.getFieldErrors()) {
                errors.put(error.getField(), error.getDefaultMessage());
            }
            return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(errors);
        }
    
        // 保存操作
        brandRepository.save(brand);
    
        return ResponseEntity.ok("Brand saved successfully.");
    }
    

结论

虽然Spring Boot不再默认集成JSR 303,但这并不意味着Bean Validation API不再可用。相反,这为开发者提供了更大的灵活性,可以根据项目的具体需求选择最适合的Bean Validation实现。通过显式添加依赖,你可以轻松地在Spring Boot项目中实现强大的数据校验功能。

二,实体属性的校验注解必须指定校验分组

需要注意的是,一旦我们给Controller的接口指定了分组,则实体类中的未指定分组的注解不会生效。这一点比较坑

如下图,save方法指定 AddGroup 分组,但是实体的属性brandId没有指定任何分组。

在这里插入图片描述

调用save接口,传了brandId也不会报错,说明校验未生效。

在这里插入图片描述

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小手追梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值