文章目录
一,学习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,主要原因如下:
- 减少默认依赖:为了减小项目的启动体积和提高灵活性,Spring Boot逐渐移除了一些默认集成的组件,以降低项目的启动门槛。
- 社区标准变化:随着Java 8的发布,Bean Validation API被更新到了JSR 349,并且在Java 8及更高版本中成为标准的一部分。Spring Boot团队决定跟随社区标准的变化。
- 兼容性考虑: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进行数据校验,你需要显式添加相关依赖。
-
添加依赖
为了使用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' // 请使用最新版本
-
使用注解
添加依赖后,你可以在实体类中使用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 }
-
启用校验
在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
也不会报错,说明校验未生效。