次の場合を考えてみましょう。
というクラスを持つ「サービス」モジュールがあります
ClientService。これは、「dao」モジュールで
ClientService呼び出されるクラスを使用します。ClientDaoClientDaoメソッドがあり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クラスが含まれます。