存储库基础结构在 SDG 1.9 中抛出 StackOverflowError。11.BUILD-SNAPSHOT 使用查询 Post 处理时

Repository infrastructure throws StackOverflowError in SDG 1.9.11.BUILD-SNAPSHOT when using Query Post Processing

当使用新的 QueryPostProcessor feature 并从 1.9.10.RELEASE 切换到 SDG 1.9.11.BUILD-SNAPSHOT 时,在 Spring 上下文初始化...

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userRepository': Invocation of init method failed; nested exception is java.lang.WhosebugError
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1630)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
at org.springframework.beans.factory.support.AbstractBeanFactory.getObject(AbstractBeanFactory.java:312)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:308)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:208)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1138)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1066)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:585)
... 155 more



Caused by: java.lang.WhosebugError
at org.springframework.data.util.TypeDiscoverer.getSuperTypeInformation(TypeDiscoverer.java:465)
at org.springframework.data.util.ClassTypeInformation.getSuperTypeInformation(ClassTypeInformation.java:43)
at org.springframework.data.util.TypeDiscoverer.getSuperTypeInformation(TypeDiscoverer.java:490)
at org.springframework.data.util.ClassTypeInformation.getSuperTypeInformation(ClassTypeInformation.java:43)
at org.springframework.data.util.TypeDiscoverer.getSuperTypeInformation(TypeDiscoverer.java:490)
at org.springframework.data.util.ClassTypeInformation.getSuperTypeInformation(ClassTypeInformation.java:43)
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                at org.springframework.beans.factory.support.AbstractBeanFactory.getObject(AbstractBeanFactory.java:312)

这是一个相当有趣的结果(即 WhosebugError)并且可能是 bug/issue 与 Spring Data Commons o.s.d.util.TypeDiscoverer;我不确定,我还没有调查(更多关于下面的 WhosebugError)。

简而言之,SDG 使用 Spring Data (Commons) TypeDiscover class到"inspect"在Spring应用程序上下文中声明和注册的所有bean(定义)性质,并通过示例...

@Component
class MyUserRepositoryQueryPostProcessor 
  implements QueryPostProcessor<UserRepository, String> {
    ...
}

实现o.s.d.g.repository.query.QueryPostProcessor接口需要2位信息:QueryPostProcessor应该应用的接口类型和查询类型,在SDG的情况下是java.lang.String 由于 OQL 目前表示为 String(尽管将来可能会改变)。

这是一个 example in the SDG test suite

所以问题是,如何有效地声明和注册应用程序Repository接口QueryPostProcessor作为Spring中的bean定义上下文?

在我的集成测试中,我 "explicitly" registered my QueryPostProcessorsSpring @Configuration class 中定义为 @Bean ,而你最喜欢使用 Spring's class 路径组件扫描给定 Spring @Component 构造型注释,在某些情况下可能会出现问题。

SDG 中 QueryPostProcessors 的发现与 存储库 基础设施的 "parsing phase" 相关联。 Spring 容器可能没有 "parsed" 用于您的 QueryPostProcessors 的 bean 定义(基于使用 @Component 注释)。实际上,对于 XML 和 JavaConfig,您通常可以通过在配置中移动 bean 定义来调整解析顺序,但通常最好明确您的配置。

虽然class路径组件扫描很方便,但扫描、解析和注册过程出现问题时不太明显。

我需要考虑更多,运行 一些测试。

现在您可以按照我在 integration test.

中所做的操作

希望对您有所帮助!

此致, 约翰