package de.flower.common.validation.factory;
import de.flower.common.spring.SpringApplicationContextBridge;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.validation.beanvalidation.SpringConstraintValidatorFactory;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorFactory;
/**
* CVFactory that enables use of springs wiring in custom validators. Used for validators that are not
* created by springs own validation factory bean. hibernates default validation on insert and update
* does not know about any spring configuration.
*
* Since the factory is instantiated before the spring context is alive the factory delays instantiation of
* the delegated factory until it is needed.
*
* This factory is set in META-INF/validation.xml.
*/
public final class ApplicationContextAwareValidationFactory implements ConstraintValidatorFactory {
private ConstraintValidatorFactory constraintValidatorFactory;
public ApplicationContextAwareValidationFactory() {
}
@Override
public <T extends ConstraintValidator<?, ?>> T getInstance(final Class<T> key) {
return getConstraintValidatorFactory().getInstance(key);
}
/**
* Gets the constraint validator factory.
*
* @return the constraint validator factory
*/
public ConstraintValidatorFactory getConstraintValidatorFactory() {
if (constraintValidatorFactory == null) {
constraintValidatorFactory = new SpringConstraintValidatorFactory(getBeanFactory());
}
return constraintValidatorFactory;
}
/**
* Throws ISE when the application context is not yet available.
*
* @return the bean factory
*/
public AutowireCapableBeanFactory getBeanFactory() {
return SpringApplicationContextBridge.getInstance().getApplicationContext().getAutowireCapableBeanFactory();
}
}