代码之家  ›  专栏  ›  技术社区  ›  Abhijit Sarkar

JSR-303 bean与Spring的验证不会生效

  •  5
  • Abhijit Sarkar  · 技术社区  · 11 年前

    我已经按照文档中给出的内容配置了JSR-303自定义验证器( http://docs.spring.io/spring/docs/4.0.x/spring-framework-reference/html/validation.html ),在类路径上完成LocalValidatorFactoryBean和Hibernate验证器。然而,我的验证器拒绝参与( https://github.com/abhijitsarkar/java/tree/master/spring-jsr-303 ),以及失败的单元测试。如果您决定查看,只需克隆它并运行 gradlew clean test 从根目录。 我使用的是Spring框架4.0.2.RELEASE和Hibernate验证器5.0.3.Final。

    验证方法:

    public Coffee serve(@ValidOrder(Coffee.Blend.class) final String blend) {
    

    ValidOrder注释:

    @Documented
    @Constraint(validatedBy = {OrderValidator.class})
    @Retention(RetentionPolicy.RUNTIME)
    @Target({ElementType.METHOD,
            ElementType.FIELD,
            ElementType.ANNOTATION_TYPE,
            ElementType.CONSTRUCTOR,
            ElementType.PARAMETER})
    @NotNull
    public @interface ValidOrder {
    

    OrderValidator验证器:

    public class OrderValidator implements ConstraintValidator<ValidOrder, String> {
    

    弹簧配置:

    @Configuration
    @ComponentScan(basePackages = "name.abhijitsarkar.coffeehouse")
    @EnableAspectJAutoProxy
    public abstract class AppConfig {
    
        @Bean
        public LocalValidatorFactoryBean validator() {
            return new LocalValidatorFactoryBean();
        }
    }
    

    相关性:

    dependencies {
        compile(
                [group: 'javax.inject', name: 'javax.inject', version: injectApiVersion],
                [group: 'javax.validation', name: 'validation-api', version: beanValidationApiVersion],
                [group: 'javax.annotation', name: 'javax.annotation-api', version: annotationApiVersion],
                [group: 'org.springframework', name: 'spring-beans', version: springVersion],
                [group: 'org.springframework', name: 'spring-context', version: springVersion],
                [group: 'org.springframework', name: 'spring-aop', version: springVersion],
                [group: 'org.aspectj', name: 'aspectjrt', version: aspectjVersion]
        )
        runtime(
                [group: 'org.hibernate', name: 'hibernate-validator', version: hibernateValidatorVersion],
                [group: 'javax.el', name: 'javax.el-api', version: elVersion],
                [group: 'org.glassfish.web', name: 'javax.el', version: glassfishElVersion],
                [group: 'org.aspectj', name: 'aspectjweaver', version: aspectjVersion]
        )
    
    2 回复  |  直到 11 年前
        1
  •  21
  •   Abhijit Sarkar    10 年前
    1. 除了LocalValidatorFactoryBean之外,还需要配置MethodValidationPostProcessor。
    2. 要验证的类必须具有 @Validated 不搜索内联约束注释。

      @Configuration
      @ComponentScan(basePackageClasses = {SpringPackageComponentScanMarker.class})
      @EnableAspectJAutoProxy
      public abstract class AppConfig {
      
      @Bean
      public MethodValidationPostProcessor methodValidationPostProcessor() {
          final MethodValidationPostProcessor methodValidationPostProcessor = new MethodValidationPostProcessor();
          methodValidationPostProcessor.setValidator(validator());
      
          return methodValidationPostProcessor;
      }
      
      @Bean
      public LocalValidatorFactoryBean validator() {
          final LocalValidatorFactoryBean localValidatorFactoryBean = new LocalValidatorFactoryBean();
      
          return localValidatorFactoryBean;
        }
      }
      

    ...

    @Service
    @Validated
    public class SpringBarista extends Barista {
    

    参考手册中关于与JSR-303集成的部分很方便地忽略了这两个关键点,如果没有这两个点,BV是不会参与的。这只是让我花了6个小时的时间调试和撕心裂肺,我做了医生说的所有事情,但BV根本不会参与。我最后不得不通过Spring源代码进行调试来理解这一点。必须有一个更简单的方法,我不是唯一一个有这个问题的人。创建JIRA SPR-11473 让他们更新文档。

        2
  •  0
  •   Bart    11 年前

    从春季到验证 混合 参数需要 @Valid 前面的注释。

    您的方法可能不起作用,因为JSR303不支持参数约束。

    约束批注可以针对以下任何ElementTypes:

    约束属性的FIELD

    受限吸气器的方法

    约束bean的TYPE

    ANNOTATION_TYPE用于构成其他约束的约束

    http://beanvalidation.org/1.0/spec/#constraintsdefinitionimplementation