How to avoid cross dependency between layers because of @Constraint validatedBy?

后端 未结 2 1956
独厮守ぢ
独厮守ぢ 2021-01-04 22:56

In our project we have Service and DAO layers in separate Maven modules. Service module depends on DAO module and works with it\'s entities. The problem is that we can\'t pu

2条回答
  •  一整个雨季
    2021-01-04 22:57

    We faced the same issue in our Spring based project. To solve it in best Spring way we split ConstraintValidator interface and implementation. For example in domain layer we only have interface:

    public interface UniqueValidator extends ConstraintValidator {
    }
    

    In service layer we implement that interface:

    public class UniqueValidatorJpaImpl implements UniqueValidator {
        private EntityManager entityManager;
        ...
    }
    

    Next we declare a bean in Spring Context for UniqueValidatorJpaImpl.

    Finally to make all that staff working we extended SpringConstraintValidatorFactory. By default it only creates a new instance of class specified in validatedBy. We extended it by first looking in spring context for a bean of corresponding type:

    public class SpringConstraintValidatorFactoryEx implements ConstraintValidatorFactory {
    
        private final Logger logger = LoggerFactory.getLogger(SpringConstraintValidatorFactoryEx.class);
    
        @Autowired
        private AutowireCapableBeanFactory beanFactory;
    
        public > T getInstance(Class 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;
        }
    
    }
    

提交回复
热议问题