简体   繁体   中英

Spring Boot application without the hibernate-validator dependency

I am trying to get spring-boot (spring-boot-starter-web:1.3.5.RELEASE and spring-boot-starter-validation:1.3.5.RELEASE) working without the hibernate-validator dependency. These are the options I have:

  • Option 1: Use default OptionalValidatorFactoryBean.

  • Option 2: Find some other JSR 303 implementation - org.apache.bval:bval-jsr303 or anything else.

I tried option 1, and dependency injection ignores this setup and looks for hibernate-validator and fails:

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

With option 2, I dropped the jar on class-path and dependency injection does not pick the implementation.

It'd be nice to have a working validator flow other than hibernate-validator or, at least provide a dummy validation like option 1.

If you choose Option1 ,

Option 1: Use default OptionalValidatorFactoryBean.

From JavaDocs of OptionalValidatorFactoryBean ,

This is the actual class used by Spring's MVC configuration namespace, in case of the javax.validation API being present but no explicit Validator having been configured.

Make sure javax.validation API is present in your classpath.

=====================================================

If you choose Option2 , Using Apache BVal instead of Hibernate Validator

Option 2: Find some other JSR 303 implementation - org.apache.bval:bval-jsr303 or anything else.

<!-- Validator bean -->
<bean id="validator"
    class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
    <property name="providerClass"
        value="org.apache.bval.jsr303.ApacheValidationProvider" />
</bean>

Or Using JavaConfig

@Bean
public LocalValidatorFactoryBean localValidatorFactoryBean() throws ClassNotFoundException {
    LocalValidatorFactoryBean bean = new LocalValidatorFactoryBean();
    
    bean.setProviderClass(org.apache.bval.jsr303.ApacheValidationProvider.class);
    // bean.setProviderClass(org.apache.bval.jsr.ApacheValidationProvider.class);
    // bean.setProviderClass(org.hibernate.validator.HibernateValidator.class);
   
    return bean;
}

You need to declare a bean of type LocalValidatorFactoryBean instead of OptionalValidatorFactoryBean.

You can find more about this on the spring doc .

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

And finally make sure only one implementation JAR of a JSR-303/JSR-349 provider like Hibernate Validator or Apache Bval is present on the classpath, not both.

Adding maven dependencies:

<!-- Bean Validation -->
<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
    <version>1.1.0.Final</version>
</dependency>

<dependency>
    <groupId>org.apache.bval</groupId>
    <artifactId>bval-jsr</artifactId>
    <version>1.1.2</version>
</dependency>

In action, Spring Boot output:

***************************
APPLICATION FAILED TO START
***************************

Description:

Binding to target MyProperties(prop1=null, ...) failed:

    Property: prop1
    Value: null
    Reason: must not be null

Action:

Update your application's configuration

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM