存储库基础结构在 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 QueryPostProcessors
在 Spring @Configuration
class 中定义为 @Bean
,而你最喜欢使用 Spring's class 路径组件扫描给定 Spring @Component
构造型注释,在某些情况下可能会出现问题。
SDG 中 QueryPostProcessors
的发现与 存储库 基础设施的 "parsing phase" 相关联。 Spring 容器可能没有 "parsed" 用于您的 QueryPostProcessors
的 bean 定义(基于使用 @Component
注释)。实际上,对于 XML 和 JavaConfig,您通常可以通过在配置中移动 bean 定义来调整解析顺序,但通常最好明确您的配置。
虽然class路径组件扫描很方便,但扫描、解析和注册过程出现问题时不太明显。
我需要考虑更多,运行 一些测试。
现在您可以按照我在 integration test.
中所做的操作
希望对您有所帮助!
此致,
约翰
当使用新的 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 QueryPostProcessors
在 Spring @Configuration
class 中定义为 @Bean
,而你最喜欢使用 Spring's class 路径组件扫描给定 Spring @Component
构造型注释,在某些情况下可能会出现问题。
SDG 中 QueryPostProcessors
的发现与 存储库 基础设施的 "parsing phase" 相关联。 Spring 容器可能没有 "parsed" 用于您的 QueryPostProcessors
的 bean 定义(基于使用 @Component
注释)。实际上,对于 XML 和 JavaConfig,您通常可以通过在配置中移动 bean 定义来调整解析顺序,但通常最好明确您的配置。
虽然class路径组件扫描很方便,但扫描、解析和注册过程出现问题时不太明显。
我需要考虑更多,运行 一些测试。
现在您可以按照我在 integration test.
中所做的操作希望对您有所帮助!
此致, 约翰