深入理解Springboot中的@Validated与@Valid差异

需积分: 0 4 下载量 65 浏览量 更新于2024-11-18 收藏 179KB RAR 举报
资源摘要信息:"Springboot参数校验@Validated和@Valid区别源码" 在Springboot框架中,参数校验是保证数据输入正确性的重要环节。参数校验一般可以防止数据的错误和不一致性,提高系统的健壮性。在实际开发过程中,开发者经常需要利用校验注解来实现复杂的校验逻辑。Springboot中提供了两个常用的校验注解:@Validated和@Valid。尽管它们在表面上看起来相似,但它们之间存在着关键的不同。 @Validated注解是Spring提供的一个校验注解,它是基于MethodValidationPostProcessor来实现的。@Validated通常用于类级别或方法级别的校验,并且它可以指定校验分组(Grouping)。通过在类或者方法上添加@Validated注解,Spring可以对相应的对象进行校验,这是在Spring框架中进行方法参数校验的首选方式。 @Valid注解则是JSR-303/JSR-380规范中定义的一个标准的校验注解。它可以用于方法参数校验,并且可以配合Hibernate Validator这样的实现类库来使用。@Valid在使用时,需要在控制器层配合BindingResult一起使用,这样才能处理校验失败的情况。 在源码层面,这两个注解的实现有本质的区别: 1. @Validated的实现基于AOP(面向切面编程),Spring会为带有@Validated注解的方法创建一个代理对象。当调用这个方法时,实际上是调用的代理对象的包装方法,Spring在这个包装方法中进行校验逻辑的处理。@Validated注解可以配合groups属性,用来指定校验组,这样就可以根据不同的校验需求执行不同的校验逻辑。 2. @Valid注解的校验则是通过在方法参数上直接使用 javax.validation.Validator来进行的。在Spring MVC中,当一个方法参数被@Valid注解时,Spring会自动调用Validator接口的validate方法来执行校验。如果校验不通过,通常会抛出MethodArgumentNotValidException异常。 具体实现机制: 当使用@Validated时,Spring利用的是MethodValidationPostProcessor后处理器,该后处理器会启用一个Aspect,这个Aspect是一个切面,它会拦截标注了@Validated的方法,并在方法执行前调用Validator接口的校验方法。这里需要注意的是,@Validated能够触发的是一个类级别的校验器(如果定义了的话),或者是一个由JSR-303/JSR-380提供的标准校验器。 当使用@Valid时,与@Validated不同,它与特定的校验框架(如Hibernate Validator)紧密集成,利用了Java的Validation API。当方法参数上有@Valid注解时,Spring MVC的HandlerMethodArgumentResolver会处理这个参数,并把参数传递给校验框架。在实际校验过程中,如果参数对象违反了约束条件,就会抛出相应的异常(比如ConstraintViolationException)。 在使用上的区别: - @Validated可以在方法上使用,也可以在类上使用,当它用在类上时,可以指定分组进行校验,而@Valid通常只能用于方法参数上。 - @Validated通常用于Spring管理的bean中,而@Valid可以用在任何需要校验的地方,不仅仅是Spring管理的bean。 - 从异常处理的角度看,@Validated的校验失败会通过异常触发,异常通常包含了一个ConstraintViolation对象,这个对象包含了违反约束条件的详细信息。@Valid注解如果结合了Hibernate Validator,则可以使用更丰富的异常类型,比如ConstraintViolationException等。 总结来说,开发者需要根据实际的项目需求和个人偏好来选择使用@Validated或者@Valid。如果项目中已经使用了Hibernate Validator或者对校验分组有明确需求,则推荐使用@Validated;如果需要更简便地进行校验,或者在非Spring的环境中进行校验,则可以使用@Valid注解。无论选择哪一个,都需要注意异常处理和校验逻辑的合理运用,以确保系统的健壮性和数据的准确性。
2021-03-21 上传