2017-07-31 9 views
0

私はRxJavaとSpring REST APIで何が最善であるのだろうか?RxJavaカスタム例外処理/伝播春のブート休憩アプリケーション

私は単純なRESTサービスを持っていますが、エラーが発生した場合はリポジトリに特定のカスタムエラーをクライアントに伝えたいと思います。しかし、私はRxJavaと異なるカスタム例外をどのようにマッピングするのか分かりません。ここで

は、バックエンドへの呼び出しです:

private Single<Customer> findCustomerById(long customerId) { 
    return Single.fromCallable(() -> getRestTemplate().getForObject(
      MyBackendService.SEARCH_CUSTOMER_BY_ID.getUrl(), 
      Customer.class, customerId)) 
      .onErrorResumeNext(ex -> Single.error(new BackendException(ex))); 
} 

マイ例外:

public class BackendException extends Exception { 
public BackendException(String message) { 
    super(message); 
} 

public BackendException(Throwable cause) { 
    super(cause); 
} 

そこで問題は、(のはNotFoundを言う404をできるように、このBackendException RxJavaを/マップで伝播する方法であります)またはInternalServerError(500)?

答えて

0

私はcare aboutというHTTP応答の種類ごとに例外を持つ例外ライブラリを使用し、HTTP応答の本体に入れてRESTクライアントによって簡単に解析できる標準エラークラス、つまりコードとメッセージ。

例外を異なるHTTP応答に変換する場合は、使用しているSpringおよびRESTライブラリのバージョンによって異なります。これには、hereherehereというさまざまな方法があります。

あなたがRxJavaを使用しているということは、あなたのアプローチを決める上で重要なことではありません。私はあなたの例にあるものと同様のonErrorResumeNextコードを使用しました。

0

RxJavaサブスクリプションメカニズムを使用してエラーを処理し、onErrorResumeNextを使用して例外ではなく値を返します。

//The web service call is just this 
private Single<Customer> findCustomerById(long customerId) { 
     return Single.fromCallable(() -> 
        getRestTemplate().getForObject(MyBackendService.SEARCH_CUSTOMER_BY_ID.getUrl(), 
          Customer.class, 
          customerId)); 
    } 
... 

//Then just manage the exception on the subscription 
findCustomerById(long customerId) 
    .subscribe(customer -> { 
     //Write the success logic here 
     System.out.println(customer); 
    }, throwable -> { 
     //Manage the error, for example 
     throwable.printStackTrace(); 
    }); 

はそれが役に立てば幸い...

:私はこのような何かをするだろう