4

次の場合を考えてみましょう。

  • というクラスを持つ「サービス」モジュールがありますClientService

  • これは、「dao」モジュールでClientService呼び出されるクラスを使用します。ClientDao

  • ClientDaoメソッドがありinsert(@Valid Client c)ます。このメソッドはをスローしDaoExceptionます。

  • クライアントは私の実体です。彼の属性には、のようなjavaxBean検証が付けられています@javax.validation.constraints.NotNull

いくつかの制約に違反した場合、ClientServiceを受け取りますConstraintViolationException。ただし、「dao」モジュールのその他の例外ClientServiceのみを期待します。DaoExceptionそして、私はそれを維持したいと思います。オブジェクトが実行するタスクに直接関連する例外のみをスローし、上位層(この場合は「サービス」モジュール)の実装の詳細を非表示にします。

私がやりたいのは、私の「dao」モジュールのjavax.validation.ConstraintViolationExceptionaにカプセル化し、それを.とともに句で宣言することです。そして、自分で検証チェックを実行したくない(そのため、アノテーションを使用します)ValidationExceptiontrowsDaoException@Valid

ここにコードがあります(単純にするために、インターフェイス、インジェクション、その他すべてを抽象化します)

package service;

class ClientService {
    insert(Client c) throws ServiceException {
        try {
            new ClientDao().insert(c);
        } catch( DaoException e) {
            throw new ServiceException(e);
        }
    }
}

package dao;

class ClientDao {
    insert(@Valid Client c) throws DaoException {
        myEntityManagerOrAnyPersistenceStrategy.insert(c);
    }
}

daoクラスを次のようなものに変更したいと思います。

package dao;

class ClientDao {
    insert(@Valid Client c) throws DaoException, MyValidationException {
        myEntityManagerOrAnyPersistenceStrategy.insert(c);
    }
}

しかし、私が説明した方法でこれを行う方法がわかりません。

FTR、このプロジェクトではSpringWebFlowとHibernateを使用しています。daoモジュールには@Repositoryクラスが含まれ、サービスモジュールには@Serviceクラスが含まれます。

4

1 に答える 1

2

@Validおそらく私は何かを理解していませんが、あなたの場合、検証は永続性プロバイダーによって自動的に実行され、アノテーションとは何の関係もないと思います。

ConstraintViolationExceptionもしそうなら、あなたは単にあなたのDAOメソッドの内部を捕まえることができます:

class ClientDao {
    insert(@Valid Client c) throws DaoException, MyValidationException {
        try {
            myEntityManagerOrAnyPersistenceStrategy.insert(c);
        } catch (ConstraintViolationException ex) {
            throw new MyValidationException(...);
        }
    }
}
于 2011-02-24T08:56:50.723 に答える