2017-11-17 7 views
0

私は、3つの依存するサービスを備えた小さなマイクロサービスアーキテクチャを持っています。各サービスは別々のSpringブートプロジェクトを表します。アーキテクチャの最下位レベルで例外が発生した場合、他のすべてのサービスを最高/ユーザーエンドポイントサービスまでスローしたいと思います。複数のサービスを通じて例外をスローする

各サービスAPIは、HttpEntity(応答エンティティ)と特定のオブジェクトを返します。私はResponseEntityExceptionHandlersのような多くの可能な解決策を見つけましたが、複数の依存するサービスがない単一のサービスアーキテクチャに対してすべての例が示されていました。

Springブートで複数のサービスを通じて例外をスローする方法がありますか?

+0

サービスの通信方法 – SirKometa

+0

休憩のような投稿経由で/ – Stev

+0

を取得するので、AはBを呼び出し、BはCとCが例外をスローします。 – SirKometa

答えて

1

3つのサービスA(Bに直接関連する)、b(Cに直接関連する)、CというユーザーがサービスAを呼び出すと仮定しますが、任意の数のサービスに適用できます。

エラーがサービスC(例外がスロー)で発生した場合、私は簡単にあなたにアプローチ

を説明します、あなたのコードは、例外をキャッチし、意味のある応答を返す必要があります。私は@ControllerAdvice

@ControllerAdvice 
public class GlobalExceptionHandler { 

     @ExceptionHandler(YourException.class) 
     public ResponseEntity<ApiErrorDto> handleYourException(YourException e) { 
     return ResponseEntity 
      .status(HttpStatus.BAD_REQUEST) //or any other suitable 
      .body(new ApiError(e.getMessage()); 
    } 
} 

ApiErrorだろうと考えることができ、最も簡単なメッセージ、またはあなたの例外処理のために意味のある他のフィールドを保持する単一のフィールドを持つだけで、基本的なPOJOクラスである可能性があります。

あなたのサービスBが応答を受け取ったら、それは期待されるステータスコードかエラーステータスコードかどうかをチェックし、それに応じて行動する必要があります。

あなたのApiErrorクラスは、すべてのサービス間で共有して、あらゆる場所で簡単にシリアライズ/デシリアライズできるようにする必要があります。そのようにしてエラーが発生すると、次に何をするかを決めることができます。シナリオの1つでは、サービスBのExceptionHandlerが他の例外をスローする可能性があります。

これは初心者です。あなたのApiErrorのメッセージ、または多分何らかの意味のあるコードなどがあります。結論としては、エラーが発生したサービスの応答にその情報を含めて、その情報を呼び出し元のサービスで解釈する必要があります。

+0

で進めたい特定の情報があります。ありがとうございます。私はまったく同じことをしました。私の苦労は、レスポンスを受け取って検証することです:最終ユーザuser = new RestTemplate()。postForObject( "url"、request、User.class); ユーザークラスが必要であり、例外が返されたときに失敗します。 – Stev

+0

ステータスが4xxの場合、PostForObjectはキャッチできる 'HttpClientErrorException'を返します。また、RestTemplateの 'ResponseErrorHandler'を設定することができます – SirKometa

+0

しかし、私はスローされた特定の/独自の例外メッセージを失います:( – Stev

関連する問題