gpt4 book ai didi

java - 获取 @RestControllerAdvice 中带注释的 @Async 方法抛出的异常

转载 作者:行者123 更新时间:2023-11-30 05:45:50 25 4
gpt4 key购买 nike

有一个非常相似的问题here ,但答案不足以解决我的问题。

我在 @Service 类中有这个方法:

@Async
public void activateUser(...){
if(someCondition){
throw new GeneralSecurityException();
}
}

Controller :

@GetMapping( "/activate")
public ResponseEntity<Void> activate(...){
myService.activateUser(...);
}

Controller 建议:

@RestControllerAdvice( basePackages = "com.app.security" )
public class SecurityAdviceController extends ResponseEntityExceptionHandler {

@ExceptionHandler( GeneralSecurityException.class )
public ResponseEntity<GeneralSecurityExceptionBody> handleGeneralSecurityException( GeneralSecurityException ex ) {
return ResponseEntity
.status( HttpStatus.MOVED_PERMANENTLY )
.header( HttpHeaders.LOCATION, ex.getUrl() )
.body( null );
}

我们到了。由于异常将在另一个线程中抛出,我该如何继续使其可用于 @RestControllerAdvice

许多人建议实现AsyncUncaughtExceptionHandler ,我同意,但这并不能回答问题。

当我删除 @Async 时,一切都很好,我可以看到同一个线程执行所有任务,但使用 @Async 时,我涉及 2 个线程。

一种解决方案是获取父线程抛出的异常(但这太麻烦了,我不知道如何实现)。

感谢您的帮助。

最佳答案

如果您确实想要异步工作,那么您很可能使用了错误的工具 - 最好切换到 Spring WebFlux并使用响应式(Reactive)方法。

回到问题,我可以建议两种方法:

  • 摆脱@Async或使用SyncTaskExecutor ,所以任务将在调用线程中同步执行。
  • 删除此特定方法的@ExceptionHandler(GeneralSecurityException.class)。相反,使用 CompletableFuture 并提供异常处理逻辑。下面是在 Controller 和服务中使用 CompletableFuture 的草图:
@Controller
public class ApiController {
private final Service service;
public ApiController(Service service) {
this.service = service;
}
@GetMapping( "/activate")
public CompletableFuture<Void> activate(...){
return service.activateUser(...)
.exceptionally(throwable -> ... exception handling goes here ...)
}
}

@Service
public class Service {
@Async
public CompletableFuture<Void> activateUser(...) {
CompletableFuture<Void> future = new CompletableFuture<>();
... your code goes here ...
if(someCondition){
future.completeExceptionally(new GeneralSecurityException());
} else {
future.complete(null);
}
return future;
}
}

关于java - 获取 @RestControllerAdvice 中带注释的 @Async 方法抛出的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54847338/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com