次の場合を考えてみましょう。
というクラスを持つ「サービス」モジュールがあります
ClientService
。これは、「dao」モジュールで
ClientService
呼び出されるクラスを使用します。ClientDao
ClientDao
メソッドがありinsert(@Valid Client c)
ます。このメソッドはをスローしDaoException
ます。クライアントは私の実体です。彼の属性には、のようなjavaxBean検証が付けられています
@javax.validation.constraints.NotNull
。
いくつかの制約に違反した場合、ClientService
を受け取りますConstraintViolationException
。ただし、「dao」モジュールのその他の例外ClientService
のみを期待します。DaoException
そして、私はそれを維持したいと思います。オブジェクトが実行するタスクに直接関連する例外のみをスローし、上位層(この場合は「サービス」モジュール)の実装の詳細を非表示にします。
私がやりたいのは、私の「dao」モジュールのjavax.validation.ConstraintViolationException
aにカプセル化し、それを.とともに句で宣言することです。そして、自分で検証チェックを実行したくない(そのため、アノテーションを使用します)ValidationException
trows
DaoException
@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
クラスが含まれます。