2014-02-23 75 views
5

我已經按照文檔(http://docs.spring.io/spring/docs/4.0.x/spring-framework-reference/html/validation.html)中給出的內容配置了一個JSR-303自定義驗證程序,並在類路徑中添加了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。Spring的JSR-303 bean驗證沒有啓動

下驗證方法:

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> { 

Spring配置:

@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] 
    ) 

回答

0

對於彈簧驗證在共混物參數踢需要在它前面的一個@Valid註釋。

由於JSR303不支持參數約束,因此您的方法可能無法使用。

約束註釋可以針對以下任一ElementTypes的:

領域用於約束屬性

方法約束干將

TYPE用於約束豆

ANNOTATION_TYPE用於構成其他約束的約束

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

+1

'@ Valid'用於遞歸驗證一個bean,我不確定它是否對String類型有效;它可能期望類的成員有自己的驗證約束。無論如何,這不是我的問題。請看我上面的答案。 –

+0

此外,BV 1.1支持參數約束http://beanvalidation.org/1.1/spec/#constraintsdefinitionimplementation –

+0

感謝您清除該問題。 – Bart

18
  1. 甲MethodValidationPostProcessor需要除了LocalValidatorFactoryBean進行配置。
  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不會踢,這只是這2個關鍵點導致我花了6個小時的時間進行調試和脫毛,在那裏我做了所有文檔說的事情,但BV根本就沒有開始。我終於必須通過Spring源代碼進行調試才能理解這一點。有一個更簡單的方法,我不能是唯一有這個問題的人。創建了JIRA SPR-11473供他們更新文檔。