11

私たちのプロジェクトでは、別々のMavenモジュールにServiceレイヤーとDAOレイヤーがあります。サービスモジュールはDAOモジュールに依存し、そのエンティティと連携します。問題は、DAOエンティティのサービスレイヤーから一部のサービスを使用するカスタムjsr 303制約を設定できないことです。これは、バリデータークラスがカスタムのvalidatedBy属性で参照される必要があるため、DAOレイヤーからサービスレイヤーへの後方参照が作成されるためです。 @Constraint。

(標準のjsr 303 apiを使用して)実行時にカスタム制約のバリデータークラスを指定する(または他の方法で問題を解決する)方法はありますか?組み込みの制約には空のvalidatedBy属性がありますが、そのためのAPIがあるかどうかはわかりません。

4

2 に答える 2

13

Spring ベースのプロジェクトでも同じ問題に直面しました。Spring の最良の方法で解決するために、 ConstraintValidator インターフェイスと実装を分割します。たとえば、ドメイン層にはインターフェースしかありません。

public interface UniqueValidator extends ConstraintValidator<Unique, String> {
}

サービス層では、そのインターフェースを実装します:

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

次に、UniqueValidatorJpaImpl の Spring Context で Bean を宣言します。

最後に、すべてのスタッフを機能させるために、SpringConstraintValidatorFactory を拡張しました。デフォルトでは、validatedBy で指定されたクラスの新しいインスタンスのみを作成します。最初にSpringコンテキストで対応するタイプの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;
    }

}
于 2013-08-21T08:43:34.277 に答える
5

XML ベースの制約マッピングを使用してバリデーターを制約に割り当て、アノテーションからバリデーター実装への参照を回避できます。

BV 1.1 EG では、その領域の改善についても議論しています。メーリング リストでこの問題について自由に検討してください。

于 2012-07-30T19:00:17.937 に答える