2017-10-31 14 views
0

私はスプリング5を使用してWebアプリケーションを作成しようとしています。それは他のマイクロサービスにはほとんど触れないマイクロサービスです。あるサービスからの応答は、他のサービスに依存しています。アプリケーションでグローバル例外ハンドリングを使用しています。ここでSpringリアクトルと従属応答でのグローバル例外処理

は私のコードです:エラーの場合には

@Override 
public Mono<Response> checkAvailablity(Request request) { 
    Mono<Response> authResponse = userService.authenticateToken(request); 
    return authResponse.doOnSuccess(t -> { 
     // if success is returned. 
     // Want to return this innerResponse 
    Mono<Response> innerResponse = 
httpService.sendRequest(Constant.SER_BOOKING_SERVICE_CHECK_AVAILABILTY, 
       request.toString(), Response.class); 

    }).doOnError(t -> { 
     logger.info("Subscribing mono in Booking service - On Error"); 
     Mono.error(new CustomException(Constant.EX_MODULE_CONNECTION_TIMED_OUT)); 
    }); 

私はCustomExceptionをスローし、グローバルな例外ハンドラでそれをキャッチしたい:上記のコードに基づいて

@ControllerAdvice 
public class ExceptionInterceptor { 
public static Logger logger = Logger.getLogger(ExceptionInterceptor.class); 

@ExceptionHandler(value = CustomException.class) 
@ResponseBody 
public Response authenticationFailure(ServerHttpRequest httpRequest, ServerHttpResponse response, 
     CustomException ex) { 
    logger.info("CustomException Occured with code => " + ex.getMessage()); 
    return buildErrorResponse(ex.getMessage()); 
} 

私は二つの問題があります。

  1. Mono.error()でスローされた例外は、グローバル例外ハンドラでは取り込まれません。
  2. 成功した場合は、内部サービスからの応答を返す必要があります。モノラルでの2つのメソッドを使用し

答えて

0

:flatmap()とonErrorMap()

と私のcheckAvailablity()コード更新:

public Mono<Response> checkAvailablity(Request request) { 
    Mono<Response> authResponse = userService.authenticateToken(request); 
    return authResponse.flatmap(t -> { 
    // Added transform() for success case 
    Mono<Response> response = httpService.sendRequest(Constant.SER_BOOKING_SERVICE_CHECK_AVAILABILTY, 
       request.toString(), Response.class); 
     logger.info("Response from SER_BOOKING_SERVICE_CHECK_AVAILABILTY"); 
     return response; 
    }).onErrorMap(t -> { 
     // Added onErrorMap() for failure case & now exception is caught in global exception handler. 
    throw new CustomException(Constant.EX_MODULE_CONNECTION_TIMED_OUT); 
    }); 
} 
関連する問題