2012-07-30 10 views
7

私たちのプロジェクトでは、サービス層とDAO層が別々のMavenモジュールにあります。サービスモジュールはDAOモジュールに依存し、そのエンティティと連携します。問題は、バリデーションクラスがcustomのvalidatedBy属性で参照される必要があるため、DAOエンティティのサービスレイヤからのサービスを使用するcustom jsr 303の制約をDAOレイヤからサービスレイヤに作成することができないということです@拘束。@Constraint validatedByのために、レイヤー間の相互依存を避ける方法は?

実行時にカスタム制約のバリデータークラスを指定する方法(標準のjsr 303 apiを使用する方法)がありますか(または他の方法で私たちの問題を解決してください)?ビルトインされた制約にはvalidatedByという空の属性がありますが、それにはいくつかのAPIがあるかどうかはわかりません。

+0

programers.seを試しましたか? – Pureferret

答えて

4

XML based constraint mappingを使用して、バリデータに注釈からの参照を避けるためにバリデータにバリデータを割り当てることができます。

BV 1.1 EGdiscussingです。 mailing listの問題に気をつけてください。

+0

Hibernate Validatorで作業する場合、サービスローダーメカニズムを使用して[制約のバリデータを検索する](https://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/#_constraint_definitions_via_code_serviceloader_code)、制約注釈型からそのバリデーターへのリンクを回避する。 – Gunnar

9

私たちは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; 
    } 

} 
+0

純粋なJava EEプロジェクトです(春はありません)。同様のソリューションが動作します。多少容易ですが、検証メソッド(何も拡張する必要はありません)を使用してインターフェイスを実装し、サービスレイヤに実装し、ドメインレイヤのバリデータに直接挿入するだけです。 – ymajoros

+0

純粋なJava EEプロジェクトです(春はありません)。同様のソリューションが動作します。多少容易ですが、検証メソッド(何も拡張する必要はありません)を使用してインターフェイスを実装し、サービスレイヤに実装し、ドメインレイヤのバリデータに直接挿入するだけです。 – ymajoros

関連する問題