Spring反应器中的全局异常处理和相关响应

时间:2017-10-31 14:45:40

标签: spring spring-boot

我正在尝试使用spring 5创建一个Web应用程序。这是一项微服务,几乎没有其他微服务。来自一个服务的响应取决于另一个。我正在使用全局异常处理我的应用程序。

这是我的代码:

@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. 如果成功,应返回内部服务的响应。

1 个答案:

答案 0 :(得分:0)

在mono中使用了两种方法: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);
    });
}