Выбросить new RuntimeException() из Mono в AOP

У меня есть реактивное приложение springboot, в нем аспект

@Before("approveRejectPointcut()")
public void logAfterReturning(JoinPoint joinPoint) {
   
    Status newStatus = AspectUtils.returnFirstParameterOfTypeOrFail(allParameters, Status.class, "approveRejectPointcut");
    String comments = AspectUtils.returnFirstParameterOfTypeOrFail(allParameters, String.class, "approveRejectPointcut");
    
    Mono<Object> someObjectOrException = someService.updateApplicationStatus(appId, newStatus, comments);
    
    someObjectOrException
      .subscribe(i->log.info(i),
            error->{
                log.info("we have some ex: "+error.getMessage());
                throw new RuntimeException("PLEASE LORD: "+error.getMessage()); 
      });
}

Что здесь происходит, updateApplicationStatus() из некоторой службы в какой-то момент выдает исключение Business (что хорошо), в этом аспекте я печатаю сообщение об исключении, что тоже хорошо. Однако, когда я пытаюсь сгенерировать бизнес-исключение (исключение RuntimeException в его основе) ... я вижу это исключение в консоли, однако... оно не достигает клиента. Я подозреваю, что его бросили в другой поток. Какие-нибудь подсказки?

1 ответ

В итоге изменил аспект на @Around

@Around("approveRejectPointcut()")
public Mono<Object> logAfterReturning(ProceedingJoinPoint pjp) {
...
Mono<Object> someObjectOrException = someService.updateApplicationStatus(appId, newStatus, comments);
someObjectOrException
      .map(unused->pjp.proceed(pjp.getArgs())
      .onErrorMap(RuntimeException.class, (s)->{
            return new GenericBusinessException(s.getMessage());
      }); 
}

таким образом, если в службе все идет хорошо -> мы продолжаем выполнение, в противном случае мы генерируем наше бизнес-исключение с сообщением об исключении из службы. Возможно, этот map() следует заменить на какой-нибудь другой оператор, принимающий функцию..:)

Другие вопросы по тегам