Jackson反序列化为对象时能否使用javax.validation.@Valid做校验?
为什么局部变量加@Valid不生效
@Valid(javax.validation.Valid)是JSR-303/JSR-380规范定义的校验注解,Spring框架的校验能力基于AOP实现,只会对Spring托管Bean的公共方法的入参、返回值上标注的@Valid做拦截处理,方法内部局部变量上的注解不会被Spring扫描解析,所以你当前的写法不会触发校验。
方案1:基于@Valid实现(需调整方法结构)
如果要使用@Valid注解触发校验,可以按照以下逻辑调整代码:
- 给
JsonStringToObjectConverter类添加@Validated注解(org.springframework.validation.annotation.Validated,是Spring开启参数校验的必要注解) - 把反序列化后的对象作为新方法的入参,在入参前加
@Valid触发校验,示例代码如下:
@Service @Validated public class JsonStringToObjectConverter { private final ObjectMapper objectMapper; public JsonStringToObjectConverter(ObjectMapper objectMapper) { this.objectMapper = objectMapper; } public IncidentModel convertToObject(String jsonStr) throws JsonProcessingException { IncidentModel model = objectMapper.readValue(jsonStr, IncidentModel.class); // 调用带校验的方法触发@Valid逻辑 return validateModel(model); } // 入参标注@Valid触发校验 public IncidentModel validateModel(@Valid IncidentModel model) { // 校验通过直接返回,校验不通过Spring会抛出ConstraintViolationException return model; } }
也可以直接把
@Valid加在convertToObject方法的返回值上,写法为public @Valid IncidentModel convertToObject(String jsonStr),返回对象时会自动触发校验。
方案2:手动校验(更推荐,无需调整方法结构)
这类场景更推荐直接注入Validator实例手动触发校验,不会出现AOP内部调用不生效的问题,更稳定可靠:
- 注入
javax.validation.Validator实例到Converter类中(Spring环境已经自动配置好该Bean,可直接注入) - 反序列化得到对象后调用校验方法,自行处理校验结果,示例代码如下:
@Service public class JsonStringToObjectConverter { private final ObjectMapper objectMapper; private final Validator validator; public JsonStringToObjectConverter(ObjectMapper objectMapper, Validator validator) { this.objectMapper = objectMapper; this.validator = validator; } public IncidentModel convertToObject(String jsonStr) throws JsonProcessingException { IncidentModel model = objectMapper.readValue(jsonStr, IncidentModel.class); // 手动触发校验 Set<ConstraintViolation<IncidentModel>> violations = validator.validate(model); if (!violations.isEmpty()) { // 可根据业务需求抛出异常或自定义处理校验结果 throw new ConstraintViolationException("IncidentModel参数校验不通过", violations); } // 校验通过执行后续逻辑 return model; } }
内容的提问来源于stack exchange,提问作者sumit
相关产品推荐
相关产品推荐

