2014-05-12 2 views
31

Ich habe ein Problem, das Validator in die Feder Anwendung Bohne Injektion, wenn ein Modell mit JSR-303 zu validieren versucht (Hibernate-Validator)Frühlings-Boot Wie man richtig javax.validation.Validator injiziert

Mein Haupt Konfigurationsklasse ist:

@EnableAutoConfiguration 
@EnableWebMvc // <--- 
@EnableJpaRepositories("com.example") 
@EntityScan("com.example") 
public class MainConfiguration { 

nach der javadocs:

/** 
* Provide a custom {@link Validator} instead of the one created by default. 
* The default implementation, assuming JSR-303 is on the classpath, is: 
* {@link org.springframework.validation.beanvalidation.LocalValidatorFactoryBean}. 
* Leave the return value as {@code null} to keep the default. 
*/ 
Validator getValidator(); 

Hibernate-Validator auf dem classpath ist. Ich versuche, es in das Repository zu injizieren:

No qualifying bean of type [javax.validation.Validator] found for dependency: 

UPDATE:

@Repository 
public class UserRepositoryImpl implements UserRepositoryCustom { 

    @Autowired 
    private Validator validator; 

Exception geworfen für diese

Die partielle Work-around ist dies zu definieren, in die Hauptkonfigurationsklasse:

@Bean 
    public Validator validator() { 

     return new org.springframework.validation.beanvalidation.LocalValidatorFactoryBean(); 
    } 

Aber Integrationstests (diejenigen, die org.springframework.test.context.web.WebAppConfiguration; Annotation und Verwendung Validierungslogik erfordern) fehlschlagen.

+1

Haben Sie versucht, eine Bohne vom Typ 'LocalValidatorFactoryBean' wie gemäß konfigurieren http://docs.spring.io/spring/docs/current/spring- Framework-Referenz/html/validation.html # Validierung-Beanvalidierung? – geoand

+0

@geoand yup, versuchte das. Wenn ich den Anwendungskontext nur ohne den WebMvc-Teil starte, sind die Tests grün. Wenn ich versuche, den Validator in den Federcontroller zu injizieren, schlagen die Tests fehl (der Validator kann nicht injiziert werden). – WeMakeSoftware

+0

@geoand scheint, dass Ihre Lösung funktioniert. Das Problem stand im Zusammenhang mit dem internen Caching/der Konfiguration von Intellij Idea. Könnten Sie das als Antwort posten, damit ich es annehmen kann – WeMakeSoftware

Antwort

42

Sie benötigen eine Bohne vom Typ LocalValidatorFactoryBean wie folgt zu erklären:

<bean id="validator" 
    class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/> 

in XML oder

@Bean 
public javax.validation.Validator localValidatorFactoryBean() { 
    return new LocalValidatorFactoryBean(); 
} 

in Java Config.

Teil der Frühlings-Dokumentation enthält alle Details

+2

Eine Notiz, die die JavaConfig behandelt. Der Rückgabewert der Methode sollte javax.validation.Validator sein. Ich werde Ihre Antwort bearbeiten – WeMakeSoftware

+0

Ok, klingt wie eine gute Idee! – geoand

+1

@SteveGreen Die Antwort hat dir geholfen! – geoand