升级至SDG 1.9.11.BUILD-SNAPSHOT使用QueryPostProcessor触发StackOverflowError
我之前碰到过一模一样的场景,StackOverflowError在Bean初始化阶段出现,十有八九是循环依赖或者无限递归调用搞的鬼。结合你升级到1.9.11.BUILD-SNAPSHOT并启用新QueryPostProcessor特性的情况,大概率是自定义Processor的写法触发了循环依赖链。
先把你提供的异常信息整理出来:
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userRepository': Invocation of init method failed; nested exception is java.lang.StackOverflowError
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableB...
问题根源
1.9.11快照版本里,QueryPostProcessor的初始化时机和1.9.10正式版有差异。如果你在自定义的QueryPostProcessor中直接注入了Spring Data Repository(比如你的userRepository),就会形成死循环:userRepository初始化 → 触发QueryPostProcessor处理 → Processor依赖userRepository → 再次触发userRepository初始化
无限递归下去直接把栈撑爆。
解决方案
针对这个问题,有几个具体的修复方向:
1. 避免在QueryPostProcessor中直接注入Repository
改用ApplicationContext延迟获取Bean,不要在构造函数或字段注入阶段直接拿Repository,而是在process方法内部动态获取:
@Component public class CustomQueryPostProcessor implements QueryPostProcessor { private final ApplicationContext applicationContext; // 只注入ApplicationContext,不直接依赖Repository public CustomQueryPostProcessor(ApplicationContext applicationContext) { this.applicationContext = applicationContext; } @Override public Query process(Query query) { // 真正需要的时候再获取Repository实例 UserRepository userRepository = applicationContext.getBean(UserRepository.class); // 你的业务处理逻辑 return query; } }
2. 调整Bean初始化顺序(备选方案)
如果业务逻辑必须依赖Repository的提前初始化,可以通过@DependsOn注解明确指定顺序,但这种方式不如第一种稳妥,仍有触发循环的风险:
@Component @DependsOn("userRepository") // 强制让Repository先完成初始化 public class CustomQueryPostProcessor implements QueryPostProcessor { // ... 你的处理逻辑 }
3. 回退或等待官方修复
你用的是BUILD-SNAPSHOT开发版本,本身就存在未稳定的潜在问题。如果上面的方法都无效,可以暂时回退到1.9.10.RELEASE版本,或者关注Spring Data GraphQL的官方更新,等待快照版本修复该bug。
内容的提问来源于stack exchange,提问作者Jebuselwyn Martin

