Java中将字符串转为Json对象时如何自动触发参数校验
解决方案
根本原因
Jackson 的 readValue 方法默认仅负责JSON反序列化逻辑,不会自动触发JSR-380(Bean Validation)规范的校验注解,需要额外配置校验逻辑。
可选实现方案
方案1:反序列化后手动触发校验(通用度最高,无额外Jackson扩展依赖)
该方案适合所有Java项目,不需要修改原有ObjectMapper的配置:
- 引入Bean Validation实现依赖(Spring Boot项目默认已集成,可跳过)
- 初始化全局校验器实例,反序列化完成后手动调用校验逻辑:
// 全局仅需初始化一次 ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory(); Validator validator = validatorFactory.getValidator(); // 反序列化逻辑 Model model = objectMapper.readValue(nameStr, Model.class); // 触发校验 Set<ConstraintViolation<Model>> validateResult = validator.validate(model); if (!validateResult.isEmpty()) { // 校验不通过,可自行封装异常抛出或处理错误信息 throw new ConstraintViolationException("参数校验失败", validateResult); }
方案2:给ObjectMapper注册校验模块,反序列化自动触发校验
该方案不需要修改现有反序列化的调用代码,在ObjectMapper初始化时完成配置即可:
- 引入对应依赖(以Jakarta版本为例,旧javax版本可找对应兼容包)
<!-- Maven依赖 --> <dependency> <groupId>com.fasterxml.jackson.module</groupId> <artifactId>jackson-module-jakarta-validation</artifactId> <version>和你项目使用的jackson版本保持一致即可</version> </dependency>
- 配置ObjectMapper:
ObjectMapper objectMapper = new ObjectMapper() // 注册校验模块,反序列化后自动执行校验 .registerModule(new JakartaValidationModule(validator));
配置完成后直接调用原有反序列化代码即可,校验不通过时会抛出JsonMappingException携带错误信息。
注意事项
- 你写在
Model类上的@Valid注解无效,该注解用于级联校验,需要加在需要嵌套校验的属性上,不需要加在类本身,可以删除。 - 不要导错校验注解的包:Spring Boot 3+ / Jakarta EE 9+ 用
jakarta.validation.constraints包下的注解,旧版本用javax.validation.constraints包下的注解,包路径错误会导致校验不生效。 - 你提供的示例JSON外层多了一层冗余引号,实际有效JSON应为
{"Name" : "MyName"},请先确保JSON格式正确。
内容的提问来源于stack exchange,提问作者prakash kandhasamy
相关产品推荐
相关产品推荐

