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?
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
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