Spring中使用@Async注解为何抛出AopInvocationException异常?
问题原因
该异常是Spring @Async注解的代理机制和基本类型返回值不兼容导致的,核心逻辑如下:
- 加了@Async注解的方法会被Spring AOP代理包裹,调用方实际调用的是代理对象的方法:
- 异步方法启动独立线程执行业务逻辑后,代理会立刻返回,不会等待业务方法执行完成
- 如果你没有用
Future/CompletableFuture作为返回值接收异步结果,代理默认会返回null
- 你的
cleanUp方法返回值是基本类型boolean,无法接收null值:代理返回的null尝试拆箱为boolean时就触发了类型不匹配的AOP异常。 - 移除@Async后方法是同步调用,业务方法执行完成后直接返回
boolean类型的真实返回值,没有代理返回null的环节,因此不会报错。
解决方案
- 方案一:如果不需要获取清理逻辑的执行结果,直接将
cleanUp方法的返回值改为void即可,这是最适配你当前使用场景的方案@Async public void cleanUp(AbstractAuthenticationToken authToken){ // 原有业务逻辑 } - 方案二:如果需要获取异步执行的结果,将返回值改为
CompletableFuture<Boolean>(或者Future<Boolean>),调用方可按需获取返回结果@Async public CompletableFuture<Boolean> cleanUp(AbstractAuthenticationToken authToken){ // 原有业务逻辑 return CompletableFuture.completedFuture(true); } - 临时兼容方案:如果不想改调用逻辑也不想处理异步结果,可以把返回值从基本类型
boolean改为包装类型Boolean,代理返回的null可以被包装类型接收,但这种方式你无法拿到真实的执行结果,仅作临时兼容用。
内容的提问来源于stack exchange,提问作者vic
相关产品推荐
相关产品推荐

