私たちはSpringベースのプロジェクトで同じ問題に直面しました。最良のSpringの方法でそれを解決するために、私たちはConstraintValidatorインターフェイスと実装を分割しました。我々はそのインターフェイスを実装
public interface UniqueValidator extends ConstraintValidator<Unique, String> {
}
サービス層では:
public class UniqueValidatorJpaImpl implements UniqueValidator {
private EntityManager entityManager;
...
}
次は我々がUniqueValidatorJpaImplのための春のコンテキストでBeanを宣言し、ドメイン層の例では、我々は唯一のインタフェースを持っています。
最後に、すべてのスタッフを働かせてSpringConstraintValidatorFactoryを拡張しました。デフォルトでは、validatedByで指定されたクラスの新しいインスタンスのみが作成されます。最初に対応するタイプのBeanを春のコンテキストで調べて拡張しました:
public class SpringConstraintValidatorFactoryEx implements ConstraintValidatorFactory {
private final Logger logger = LoggerFactory.getLogger(SpringConstraintValidatorFactoryEx.class);
@Autowired
private AutowireCapableBeanFactory beanFactory;
public <T extends ConstraintValidator<?, ?>> T getInstance(Class<T> key) {
T bean = null;
try {
logger.info("Trying to find a validator bean of class " + key.getSimpleName());
bean = this.beanFactory.getBean(key);
} catch (BeansException exc) {
logger.info("Failed to find a bean of class " + key.getSimpleName());
}
if (bean == null) {
try {
logger.info("Creating a new validator bean of class " + key.getSimpleName());
bean = this.beanFactory.createBean(key);
} catch (BeansException exc) {
logger.info("Failed to create a validator of class " + key.getSimpleName());
}
}
if (bean == null) {
logger.warn("Failed to get validator of class " + key.getSimpleName());
}
return bean;
}
}
programers.seを試しましたか? – Pureferret