spring - 在 AOP 中从 Mono 中抛出新的 RuntimeException()

标签 spring error-handling reactive spring-webclient spring-mono

我有一个响应式(Reactive) 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() 在某个时候抛出了一个业务异常(这很好),在这方面我打印了异常消息,这也很好。但是,当我尝试抛出业务异常(其基础为 RuntimeException)时......我可以在控制台中看到这个异常,但是......它没有到达客户端。
我怀疑它被扔到了另一个线程上。有什么线索吗?

最佳答案

最后,将方面更改为@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() 应该用其他一些接受函数的运算符替换.. :)

关于spring - 在 AOP 中从 Mono 中抛出新的 RuntimeException(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63819357/

相关文章:

spring - 单个事务中的多个 Spring Data JPA 存储库

java - Hadoop 配置的 getConf() 返回 null

java - Spring REST Jackson - StringBuilder 不与 JSON 绑定(bind)

python - “NoneType”对象不可下标-数据生成器

rx-java - RxJava : Blocking single vs Blocking first

R Shiny : reactivevalues from function

java - 如何使用 Wordpress 在 spring web 应用程序中对用户进行身份验证?

PostgreSQL:可以允许错误吗?

sql - TRY...CATCH 似乎不起作用

Angular react 形式将 form.values 转换为模型