Spring-Boot Hoe javax.validation.Validator correct te injecteren

Ik heb een probleem met het injecteren van de Validatorin de lente-toepassingsbean wanneer ik probeer een model te valideren met JSR-303 (hibernate-validator)

Mijn belangrijkste configuratieklasse is:

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

Volgens de 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 bevindt zich op het klassenpad.
Ik probeer het in de repository te injecteren:

@Repository
public class UserRepositoryImpl implements UserRepositoryCustom    {
    @Autowired
    private Validator validator;

Uitzondering wordt gegooid:

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

UPDATE:

De gedeeltelijke oplossing hiervoor is om dit in de hoofdconfiguratieklasse te definiëren:

 @Bean
    public Validator validator() {
        return new org.springframework.validation.beanvalidation.LocalValidatorFactoryBean();
    }

Maar integratietests (degene die org.springframework.test.context.web.WebAppConfiguration;annotatie vereisen en validatielogica gebruiken) mislukken.


Antwoord 1, autoriteit 100%

Je moet een bean van het type LocalValidatorFactoryBeanals volgt declareren:

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

in XML of

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

in Java-configuratie.

Bewerken:

Het is belangrijk om te begrijpen dat als JPA wordt gebruikt en wordt ondersteund door Hibernate, Hibernate zal proberen om zowel je Beans als het Spring Framework automatisch te valideren. Dit kan leiden tot het probleem van javax.validation.ValidationException: HV000064: Unable to instantiate ConstraintValidatoromdat Hibernate niets weet van de lente-context en voor zover ik weet is er geen manier om het te vertellen , zelfs niet met de LocalValidatorFactoryBean. Hierdoor wordt de Validator twee keer uitgevoerd. Eén correct, en een keer lukt dat niet.

Om de standaard Hibernate ORM-validatie uit te schakelen, moet de volgende eigenschap voor Spring worden ingesteld:

spring.jpa.properties.javax.persistence.validation.mode=none

Ik heb dit voorbeeld geüpdatet, omdat ik het steeds weer tegenkwam dat de Validator niet werd geïnjecteerd, en het bleek dat dit het probleem was waarmee ik werd geconfronteerd.

Diteen deel van de Spring-documentatie bevat alle details

Other episodes