升级JDK17与Spring Boot3后@Async仅支持Future/void返回类型问题
问题原因与解决方案
根源说明
这个异常是Spring Boot 3.0(底层依赖Spring Framework 6.0)的版本变更导致的,和JDK 17没有直接关系。
在Spring Boot 2.x(对应Spring Framework 5.x)中,@Async方法返回非void、非Future系列类型时,Spring不会抛出异常,但会同步执行该方法(并没有真正实现异步)。而Spring Framework 6.0开始,为了避免这种“假异步”的误导,严格校验了@Async方法的返回类型,不符合要求直接抛出异常。你之前的代码在2.7.5版本能运行,但实际上并没有真正异步执行。
解决方案
要让方法真正异步执行且符合新版本要求,需要修改返回类型为CompletableFuture<ResponseModel>(推荐,适配Java 8+的异步编程模型):
@Async("threadPoolTaskExecutor") @Override public CompletableFuture<ResponseModel> startRequest(RequestModel request, Logger logger) throws Exception { // 原有业务逻辑处理 ResponseModel response = ...; return CompletableFuture.completedFuture(response); }
调用方如需获取结果,可调用CompletableFuture的get()或join()方法(注意处理阻塞逻辑或使用异步回调)。
如果业务场景不需要返回值,也可以将方法返回类型改为void,但显然你的场景需要返回结果,因此优先推荐CompletableFuture方案。
额外说明
线程池threadPoolTaskExecutor的配置本身不是导致该异常的原因,只要你已正确定义对应的ThreadPoolTaskExecutor Bean,修改返回类型后即可正常使用。
内容的提问来源于stack exchange,提问作者Sivvie Lim
相关产品推荐
相关产品推荐

