3 タイヤ アーキテクチャのアプリケーションがあります。そして、このコンテキストで例外を処理する方法がわかりません。いくつかの質問を集めました:
1. のような一般的な例外を作成し、PersistentException
すべての DAO クラス メソッドが 1 つのタイプの例外のみをスローする ようにする必要がありPersistentException
ますか? つまり、すべての DAO メソッド (CRUD) 内では、次のようにします。
public create(Entity instance) {
try {
...// all operations here
} catch(Exception e) {
throw new PersistentException(e);
}
}
2. すべての EJB サービスに対して 1 つの例外クラスを作成しても問題ありません (EJB インターフェースごとに 1 つの例外)。
つまり、対応するとインターフェースを持つPersonManagementBean
、のような EJB Bean があるとします。それらはクライアントに公開されます。つまり、実際にはセッション ファサードです (したがって、サービス層に配置されます)。では、すべての Bean ( 、、 )に対応する Exception クラスを作成することをお勧めします。OrganizationManagementBean
EmployeeManagementBean
@local
@remote
PersonManagementException
OrganizationManagementException
EmployeeManagementException
それとも、ServiceException
(DAO の場合のように) 例外を 1 つだけ呼び出す方がよいでしょうか?
3. サービス (忙しさ) レベル (一般的なケース) をスローする可能性のある例外の種類は? DAO ( PersistentException
) 例外をクライアントに伝播できますか? すなわち
public void relocatePerson() {
try {
Person p = personDao.getPerson(); // can throw PersistentException
....
if (someCondition) {
throw new PersonManagementException(); // throwing same PersonManagementException
}
....
} catch(PersonManagementException e) {
throw e; //don't need to rewrap same exception
} catch(PersistentException e) {
throw e; // DO I need to throw it as PersistentException to client? Or it's better to rewrap it as PersonManagementException?
} catch(Exception e) {
throw new PersonManagementException(e) //throwing all exception as service specific exception
}
}
または、すべての例外 (一般的なケース) をサービス固有の例外として再スローする必要がありますか?
- 「一般的なケース」とは、場合によっては、一部のメソッドがいくつかの役立つ情報 (たとえば
ValidationException
、どのオブジェクトが検証規則を通過しないかに関する情報) を含む追加の例外をスローできることを知っていることを意味します。