Space: Apache BVal (https://cwiki.apache.org/confluence/display/BeanValidation)
Page: Obtaining a validator 
(https://cwiki.apache.org/confluence/display/BeanValidation/Obtaining+a+validator)


Edited by Matt Benson:
---------------------------------------------------------------------
To obtain a validator, you must first create a ValidatorFactory. If there is 
only one jsr303 implementation in your classpath, you can use:

{code:java}
ValidatorFactory vf = Validation.buildDefaultValidatorFactory();
{code}

to obtain the factory. If there are various implementations in the classpath, 
or you want to be sure you are using the Apache one, you can use:

{code:java}
ValidatorFactory avf = 
Validation.byProvider(ApacheValidationProvider.class).configure().buildValidatorFactory();
{code}

You should not instantiate more than one factory, as factory creation is a 
costly process and the factory also acts as a constraint cache for the 
validators.

Once you have a ValidatorFactory, obtaining a validator just requires you to 
call {{ValidatorFactory#getValidator()}}. The validator implementation is 
thread-safe, so you can choose to re-use a single instance of it in all your 
code or create validators on demand: both options are fine and should perform 
equally well.

Below is an example that will create a singleton ValidatorFactory and will let 
you obtain validators from it:

{code:java}
public enum MyValidatorFactory {
    
    SINGLE_INSTANCE {
    
        ValidatorFactory avf = 
Validation.byProvider(ApacheValidationProvider.class).configure().buildValidatorFactory();
        
        @Override
        public Validator getValidator() {
            return avf.getValidator();
        }
        
    };
    
    public abstract Validator getValidator(); 
}
{code}

Using the above class, obtaining a validator just requires you to call: 
{{MyValidatorFactory.SINGLE_INSTANCE.getValidator()}}


h3. Using Spring

If you are using Spring, you can easily inject validators in your beans. Simply 
configure the factory in your applicationContext by adding:

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

And Spring will be able to inject Validators and the ValidatorFactory in your 
beans.

h3. Using Google Guice

_Apache BVal_ provides the {{bval-guice}} module that simplifies integration 
with _Google Guice_. That module has multiple purposes, such:

* bootstrap _Apache BVal_ using _Google Guice_;
* obtain _javax.validation.ConstraintValidator_ instances using the _Google 
Guice Injector_, to easily support the DI;
* easily inject the _javax.validation.Validator_ reference into components that 
require it;
* easily intercept methods and validate method arguments.

First of all, users have to add the {{bval-guice}} module in the classpath; 
_Apache Maven_ users can easily include it just by adding the following 
dependency in the POM:

{code:xml}
<dependency>
    <groupId>org.apache.bval</groupId>
    <artifactId>bval-guice</artifactId>
    <version>0.3-incubating</version>
</dependency>
{code}

Let's have a look at the features:

h5. Apache BVal bootstrapping

Simply, the {{org.apache.bval.guice.ValidationModule}} is the _Google Guice_ 
module that bootstraps _Apache BVal_; all users have to do is add this module 
when creating the _Google Guice Injector_:

{code:java}
import com.google.inject.Guice;
import com.google.inject.Injector;

import org.apache.bval.guice.ValidationModule;

Injector injector = Guice.createInjector([...], new ValidationModule(), [...]);
{code}

h5. obtain _javax.validation.ConstraintValidator_ instances

Users can implement now _javax.validation.ConstraintValidator_ classes that 
require _Dependency Injection_ by _Google Guice_:

{code:java}
import javax.validation.ConstraintValidator;

public class MyCustomValidator implements ConstraintValidator<MyAssert, MyType> 
{

    private final MyExternalService service;

    @Inject
    public MyCustomValidator(MyExternalService service) {
        this.service = service;
    }

    public void initialize(MyAssert annotation) {
        // do something
    }

    public boolean isValid(MyType value, ConstraintValidatorContext context) {
        return value == null || this.service.doSomething(value);
    }

}
{code}

Don't forget to bind the {{MyExternalService}} class in the _Google Guice 
Bincer_!!!

h5. Inject the _javax.validation.Validator_ reference

Clients can easily inject {{javax.validation.Validator}} instances into their 
custom components just marking it using the _Google Guice Inject_ annotation:

{code:java}
import javax.validation.Validator;

public class MyValidatorClient {

    @Inject
    private Validator validator;

    public void setValidator(Validator validator) {
        this.validator = validator;
    }

    ...

}
{code}

When obtaining {{MyValidatorClient}} instances from the _Injector_, the 
{{javax.validation.Validator}} will be automagically bound.

h5. Intercept methods and validate method arguments

Taking advantage from the _Apache BVal_ extension to validate method arguments, 
the {{bval-guice}} comes with an _AOP_ interceptor - automatically initialized 
in the {{org.apache.bval.guice.ValidationModule}} - that makes easier the 
methods arguments validation.

All users have to do is annotate interested methods with 
{{org.apache.bval.guice.Validate}} annotation, then annotate arguments with 
constraints, as follows below:

{code:java}
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

import org.apache.bval.guice.Validate;

public class MyService {

    @Validate(
            groups = { MyGroup.class },
            validateReturnedValue = true
    )
    public Country insertCountry(@NotNull(groups = { MyGroup.class })
            String name,
            @NotNull(groups = { MyGroup.class })
            @Size(max = 2, groups = { MyGroup.class, MyOtherGroup.class })
            String iso2Code,
            @NotNull(groups = { MyGroup.class })
            @Size(max = 3, groups = { MyGroup.class, MyOtherGroup.class })
            String iso3Code) {

        return ...;
    }

}
{code}

The {{org.apache.bval.guice.Validate}} supports 2 parameters:

* {{groups}} Class array, _empty_ by default, that marks the groups have to be 
validated;
* {{validateReturnedValue}} flag, _false_ by default, that marks that if the 
returned object by the method execution has to be validated.

h3. Using CDI

We recommend [MyFaces CODI|http://myfaces.apache.org/extensions/cdi/index.html].

Change your notification preferences: 
https://cwiki.apache.org/confluence/users/viewnotifications.action    

Reply via email to