package br.com.caelum.vraptor.validator; import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import br.com.caelum.vraptor.ioc.ApplicationScoped; import br.com.caelum.vraptor.ioc.Container; import br.com.caelum.vraptor.proxy.ReflectionInstanceCreator; /** * Create a custom {@link ConstraintValidatorFactory} to allow users to use constraints that uses components. * * @author Otávio Scherer Garcia * @since 3.5.2 */ @ApplicationScoped public class DIConstraintValidatorFactory implements ConstraintValidatorFactory { private static final Logger logger = LoggerFactory.getLogger(DIConstraintValidatorFactory.class); private final Container container; public DIConstraintValidatorFactory(Container container) { this.container = container; } public <T extends ConstraintValidator<?, ?>> T getInstance(Class<T> key) { if (container.canProvide(key)) { logger.debug("we can provide instance for ConstraintValidator {}", key); return container.instanceFor(key); } // GH583 - we need to use reflection to instantiate constraints return new ReflectionInstanceCreator().instanceFor(key); } public void releaseInstance(ConstraintValidator<?, ?> key) { // we don't need this } }