Javaアプリケーションを開発しています。私のリソースクラスには、すべてのJAX-RS APIメソッドが定義されています。私はその障害シナリオのための特定の例外を作成し、それを投げています各サービスクラスの障害シナリオのそれぞれについて例外を使用したJava REST APIのアプリケーションおよびビジネスの失敗シナリオの処理
class Resource {
// Services are injected.
// Each service has a couple of failure scenarios.
// Exp. Request Not valid, Id not valid, Database internal error, etc.
DBService dbService;
validationService validationService;
searchService searchService;
@GET(user/:id)
public User getUser(int id) {
try {
validationService.validate(request);
dbService.getUser(id);
searchService.index(request);
...
} catch (UserNotFoundException e) {
// return proper http response code and message
} catch (UserBannedException e) {
...
} catch (DBInternalError e) {
...
} ...
}
}
:また、私は、独自のサービスクラスに各タスクを委任するために、私のリソースクラスに依存性注入を使用していますAPIクラスでこれらの例外をすべて処理するサービスクラスです。私は例外シナリオについて自分のリソースへのシグナルとしてExceptionを使用し、適切なHTTPステータスコードとメッセージを返します。
私は多くのExceptionクラスを作成していますが、Resourceクラスにはさまざまな失敗シナリオのcatchブロックの長いリストが含まれています。
たとえば、私のvalidationServiceでは、例外の代わりにfalse booleanを返し、私のリソースにはif/else文を入れ、適切なステータスコードを返します。しかし、私はこのソリューションが好きではない。なぜなら、それはif/elseステートメントとそれほど線形でないAPIで私のAPIをいっぱいにするからです。
私のユースケースには多くの例外クラスを用意しても問題ありません。また、私の使用に適したアーキテクチャはありますか?
これらの例外を処理する意味のある方法がある場合は、別の方法でそれを行ってください。そうでない場合は、例外のサブクラス化、または意味のない例外への統合を検討してください。 – CollinD
例外をスローするのではなく、エラーコールバックオブジェクトを含めるようにサービスクラスAPIを再設計することができます。その後、適切なエラー処理オブジェクトを渡して、 'throw/catch'を完全になくします。 –
[JAX-RS/Jerseyのエラー処理をカスタマイズする方法は?](http://stackoverflow.com/questions/583973/jax-rs-jersey-how-to-customize-error-handling) – jaco0646