Pablo Pablo - 3 months ago 14
Java Question

How to use Java Beans validation through hibernate-validation without a framework?

I'm using Java Beans validation through hibernate-validation on a JavaFX application, so, without a framework to help with the wiring. I added these dependencies to my project:

compile group: "org.hibernate", name: "hibernate-validator", version: "6.0.2.Final"
compile group: "org.glassfish", name: "javax.el", version: "3.0.1-b08"
compile group: "javax.validation", name: "validation-api", version: "2.0.0.Final"


and I found this works to get
modelObject
validated:

ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
validator.validate(modelObject);


My question is, is it bad to create a new factory and validator every time I validate? Should I cache them somewhere and re-use them? How expensive and how multi-threaded are the validators?

Answer Source

Is it bad to create new ValidatorFactory each time?

According to the javadoc note, the following is stated:

  • The ValidatorFactory object built by the bootstrap process should be cached and shared amongst Validator consumers.
  • This class is thread-safe.

As of Validator, its implementations also expected to be thread-safe according to javadoc

Working with javax.Validation in Spring

You've tagged your question with 'Spring', therefore a brief notice on working with javax.validation + Spring correctly.

First, use Spring LocalValidatorFactoryBean (as for example answered here), that will take care of necessary caching you're looking for:

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

Second, inject Validator instances using Spring as well:

@Autowired
private Validator validator;

You can either let Spring do all the job. For example, to make validation-related annotations work for methods, define

@Bean
public MethodValidationPostProcessor methodValidationPostProcessor() {
    return new MethodValidationPostProcessor();
}

in your Spring application configuration, and then you'll be able to call something like

public void myMethod(@Valid MyValidationAnnotatedType parameter){
    ...
}

public void anotherMethod(@Pattern(regex = "^[A-Za-z]+$") stringParameter) {
    ...
} 

Please refer to Spring documentation for further details