2014-02-23 4 views
5

Ich habe einen benutzerdefinierten JSR-303-Validator nach den Angaben in der Dokumentation (http://docs.spring.io/spring/docs/4.0.x/spring-framework-reference/html/validation.html) konfiguriert, einschließlich LocalValidatorFactoryBean und Hibernate-Validator für den Klassenpfad. Mein Validator weigert sich jedoch einfach einzusteigen. Ich habe hier ein einfaches Test-Test-Projekt erstellt (https://github.com/abhijitsarkar/java/tree/master/spring-jsr-303), zusammen mit einem fehlgeschlagenen Komponententest. Sollten Sie sich entscheiden, einen Blick darauf zu werfen, klonen Sie einfach und führen Sie gradlew clean test aus dem Stammverzeichnis. Ich benutze Spring Framework 4.0.2.RELEASE und Hibernate Validator 5.0.3.Final.JSR-303-Bean-Validierung mit Spring tritt nicht ein

Methode unter Validierung:

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

ValidOrder Anmerkung:

@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 validator:

public class OrderValidator implements ConstraintValidator<ValidOrder, String> { 

Feder config:

@Configuration 
@ComponentScan(basePackages = "name.abhijitsarkar.coffeehouse") 
@EnableAspectJAutoProxy 
public abstract class AppConfig { 

    @Bean 
    public LocalValidatorFactoryBean validator() { 
     return new LocalValidatorFactoryBean(); 
    } 
} 

Abhängigkeiten:

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

Antwort

0

Für das Frühjahr in der Mischung Argument braucht eine @Valid Anmerkung vor ihm zu treten, um die Validierung.

Ihr Ansatz funktioniert möglicherweise nicht, da Parameterbeschränkungen vom JSR303 nicht unterstützt werden.

Constraint Annotationen können jede der folgenden ElementTypes Target:

FIELD für eingeschränkte Attribute

Verfahren zur erzwungener Getter

Typ für eingeschränkte Bohnen

ANNOTATION_TYPE für Constraints anderen Einschränkungen Komponieren

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

+1

'@ Valid' wird verwendet, um eine Bean rekursiv zu validieren, ich bin mir nicht sicher, ob es überhaupt auf String-Typ funktioniert; es kann erwarten, dass Mitglieder der Klasse ihre eigenen Validierungsbeschränkungen haben. Das war sowieso nicht mein Problem. Bitte sehen Sie meine Antwort oben. –

+0

Auch Parameter-Constraints werden von BV 1.1 http://beanvalidation.org/1.1/spec/#constraintsdefinitionimplementation –

+0

unterstützt. Danke, dass Sie das geklärt haben. – Bart

18
  1. A benötigt MethodValidationPostProcessor zusätzlich zu dem LocalValidatorFactoryBean konfiguriert werden.
  2. Die zu validierende Klasse muss eine @Validated Annotation haben, sonst werden keine Methoden nach Inline-Constraint-Annotationen durchsucht.

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

Der Teil des Referenzhandbuchs, das über die Integration mit JSR-303 spricht bequem unterlässt, diese zwei entscheidenden Punkte, ohne die BV nicht in nicht kicken. Diese nur Er verursachte mir 6 Stunden Debugging und Haare zerreißen, wo ich alles tat, was der Doc sagte, aber BV würde einfach nicht eingreifen. Ich musste schließlich durch den Quellcode von Spring debuggen, um das zu verstehen.Es muss einen einfacheren Weg geben und ich kann nicht der Einzige sein, der dieses Problem hat. Erstellt eine JIRA SPR-11473 für sie das Dokument zu aktualisieren.

Verwandte Themen