【问题标题】:Spring Data GemFire 2.0.1.RELEASE is throwing an Initialization ErrorSpring Data GemFire 2.0.1.RELEASE 引发初始化错误
【发布时间】:2017-11-17 07:47:11
【问题描述】:

最初,我的应用程序在 spring-data-gemfire 1.9.7.RELEASE 上运行良好。但是,升级到 spring-data-gemfire 2.0.1.RELEASE 后,我的应用程序无法启动并抛出如下所示的初始化错误:

C:\Dev\projects\JavaWebClient\web\target>java -jar web-0.0.1-SNAPSHOT.jar

。 ____ _ __ _ _
/\ / ' __ _ ()_ __ __ _ \ \ \ \
( ( )_
| '_ | '| | ' / ` | \ \ \ \
\/
)| |)| | | | | || (| | ) ) )
' |____| .|| ||| |__, | // / /
=========|_|===============|___/=///_/
:: Spring Boot :: (v1.5.8.RELEASE)

[info 2017/11/15 19:07:23.999 EAT tid=0x1] 开始 MY-PC 上的 JavaWebClientApplication v0.0.1-SNAPSHOT,PID 为 13804 (C:\Dev\projects\JavaWebClient\web\target\web-0.0.1-SNAPSHOT.jar 由 edwards 在 C:\Dev\projects\JavaWebClient\web\target 中开始)

[info 2017/11/15 19:07:24.019 EAT tid=0x1] 没有活动的个人资料 设置,回退到默认配置文件:默认

[info 2017/11/15 19:07:24.812 EAT tid=0x1] 刷新 org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@6e6c3152: 启动日期 [Wed Nov 15 19:07:24 EAT 2017];语境之根 层次结构

[错误 2017/11/15 19:07:25.892 EAT tid=0x1] 应用程序启动 java.lang.NoSuchMethodError 失败: org.springframework.data.repository.config.RepositoryConfigurationSource.getAttribute(Ljava/lang/String;)Ljava/util/Optional; 在 org.springframework.data.gemfire.repository.config.GemfireRepositoryConfigurationExtension.registerBeansForRoot(GemfireRepositoryConfigurationExtensi on.java:120) 在 org.springframework.data.repository.config.RepositoryConfigurationDelegate.registerRepositoriesIn(RepositoryConfigurationDelegate.java:116) 在 org.springframework.data.repository.config.RepositoryBeanDefinitionRegistrarSupport.registerBeanDefinitions(RepositoryBeanDefinitionRegistrarSupport. 爪哇:83) 在 org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.lambda$loadBeanDefinitionsFromRegistrars$0(ConfigurationClassBeanDefini tionReader.java:360) 在 java.util.LinkedHashMap.forEach(未知来源) 在 org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsFromRegistrars(ConfigurationClassBeanDefinitionReade r.java:359) 在 org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForConfigurationClass(ConfigurationClassBeanDefiniti onReader.java:144) 在 org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitions(ConfigurationClassBeanDefinitionReader.java:117) 在 org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:328) 在 org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:233) 在 org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.ja 弗吉尼亚州:273) 在 org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:93) 在 org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:693) 在 org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:531) 在 org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122) 在 org.springframework.boot.SpringApplication.refresh(SpringApplication.java:693) 在 org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:360) 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:303) 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:1118) 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:1107) 在 com.nftconsult.gemfire.web.JavaWebClientApplication.main(JavaWebClientApplication.java:173) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(未知来源) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(未知来源) 在 java.lang.reflect.Method.invoke(未知来源) 在 org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48) 在 org.springframework.boot.loader.Launcher.launch(Launcher.java:87) 在 org.springframework.boot.loader.Launcher.launch(Launcher.java:50) 在 org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51)

[info 2017/11/15 19:07:25.897 EAT tid=0x1] 结束 org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@6e6c3152: 启动日期 [Wed Nov 15 19:07:24 EAT 2017];语境之根 层次结构

[警告 2017/11/15 19:07:25.901 EAT tid=0x1] 抛出异常 从 LifecycleProcessor 上下文关闭 java.lang.IllegalStateException: LifecycleProcessor 未初始化 - 在通过上下文调用生命周期方法之前调用“刷新”: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@6e6c3152: 启动日期 [Wed Nov 15 19:07:24 EAT 2017];上下文层次的根 在 org.springframework.context.support.AbstractApplicationContext.getLifecycleProcessor(AbstractApplicationContext.java:433) 在 org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:1004) 在 org.springframework.context.support.AbstractApplicationContext.close(AbstractApplicationContext.java:963) 在 org.springframework.boot.SpringApplication.handleRunFailure(SpringApplication.java:750) 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:314) 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:1118) 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:1107) 在 com.nftconsult.gemfire.web.JavaWebClientApplication.main(JavaWebClientApplication.java:173) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(未知来源) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(未知来源) 在 java.lang.reflect.Method.invoke(未知来源) 在 org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48) 在 org.springframework.boot.loader.Launcher.launch(Launcher.java:87) 在 org.springframework.boot.loader.Launcher.launch(Launcher.java:50) 在 org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51)

[error 2017/11/15 19:07:25.905 EAT tid=0x1] 销毁方法开启 有名字的豆子 'org.springframework.boot.autoconfigure.internalCachingMetadataReaderFactory ' 抛出异常 java.lang.IllegalStateException: ApplicationEventMulticaster 未初始化 - 之前调用“刷新” 通过上下文多播事件:org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@6e6c3152: 启动日期 [Wed Nov 15 19:07:24 EAT 2017];上下文层次的根 在 org.springframework.context.support.AbstractApplicationContext.getApplicationEventMulticaster(AbstractApplicationContext.java:420) 在 org.springframework.context.support.ApplicationListenerDetector.postProcessBeforeDestruction(ApplicationListenerDetector.java:95) 在 org.springframework.beans.factory.support.DisposableBeanAdapter.destroy(DisposableBeanAdapter.java:240) 在 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroyBean(DefaultSingletonBeanRegistry.java:576) 在 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroySingleton(DefaultSingletonBeanRegistry.java:552) 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.destroySingleton(DefaultListableBeanFactory.java:953) 在 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroySingletons(DefaultSingletonBeanRegistry.java:521) 在 org.springframework.beans.factory.support.FactoryBeanRegistrySupport.destroySingletons(FactoryBeanRegistrySupport.java:227) 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.destroySingletons(DefaultListableBeanFactory.java:960) 在 org.springframework.context.support.AbstractApplicationContext.destroyBeans(AbstractApplicationContext.java:1035) 在 org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:1011) 在 org.springframework.context.support.AbstractApplicationContext.close(AbstractApplicationContext.java:963) 在 org.springframework.boot.SpringApplication.handleRunFailure(SpringApplication.java:750) 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:314) 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:1118) 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:1107) 在 com.nftconsult.gemfire.web.JavaWebClientApplication.main(JavaWebClientApplication.java:173) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(未知来源) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(未知来源) 在 java.lang.reflect.Method.invoke(未知来源) 在 org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48) 在 org.springframework.boot.loader.Launcher.launch(Launcher.java:87) 在 org.springframework.boot.loader.Launcher.launch(Launcher.java:50) 在 org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51)

C:\Dev\projects\JavaWebClient\web\target>

【问题讨论】:

    标签: spring-data-gemfire


    【解决方案1】:

    这并不奇怪,因为您的 Spring 应用程序是基于 Spring Boot 1.5.8.RELEASE 并且不清楚您是如何专门升级 Spring Data GemFire em> 从 1.9.7.RELEASE2.0.1.RELEASE 的依赖关系。

    问题是,您引入了一个不兼容的 Spring Data Commons 版本以及我怀疑的其他几个 Spring 依赖项(例如核心 Spring 框架),因为您的应用程序植根于 Spring Boot 1.5.8.RELEASE。因此 java.lang.NoSuchMethodError 错误...

    java.lang.NoSuchMethodError: org.springframework.data.repository.config.RepositoryConfigurationSource.getAttribute(Ljava/lang/String;)Ljava/util/Optional; 
    at org.springframework.data.gemfire.repository.config.GemfireRepositoryConfigurationExtension.registerBeansForRoot(GemfireRepositoryConfigurationExtensi on.java:120)
    

    首先,您需要了解所有Spring Data modules(参见“主要模块”、“社区模块”和“相关模块 ”以及 SD 项目页面上关于“Release train”的部分)基于 Spring Data Commons 和核心 Spring 框架 的特定版本构建时间>。您不能简单地升级 1 个依赖项,而不必升级其他依赖项。

    SD Release Trains(例如IngallsKay)都基于特定版本的Spring Data Commons 和核心Spring Framework。例如,对于 SD Kay,请参阅“Core themes”和“Participating modules”。

    java.lang.NoSuchMethodError 之所以出现,是因为您使用的是不兼容版本的 Spring Data Commons(即来自 Ingalls 的 SDC 1.13.8.RELEASE,即 pulled in Spring Boot 1.5.x) 与 Spring Data GemFire 2.0.1.RELEASE,其中 comes from SD Kay,并期望 SDC 2.0.x.RELEASE

    这个类(即org.springframework.data.repository.config.RepositoryConfigurationSource)是一个Spring Data Commons类。显然,SDC 1.13.8 (Ingalls) 中的 method signature(即 getAttribute(:String):String)对于所讨论的方法不是 SDG 2.0.1.RELEASE 所期望的(即@987654356 @), 其中comes from SDC 2.0.1.RELEASE

    Spring Boot 以及扩展的 Spring IO 平台提供一组精心策划和协调的依赖项是有原因的都经过测试证明可以协同工作。当您偏离规定的依赖关系时,您需要注意这一点。

    从技术上讲,只有即将推出的 Spring Boot 2.0 版本将是based on SD Kay

    但是,如果您确实需要 Spring Boot 的 GA 版本(即 1.5.8.RELEASE,当前最新版本)并希望使用 Spring Data GemFire 2.0.1.RELEASE,或Kay-SR1,那你很幸运!

    我也想在 Spring Boot(即 1.5.8.RELEASE)的最新 GA 版本中使用 Spring Data Kay Spring IO Guides (for instance) 展示 Spring Data GemFire 中的新功能 2.0.x Kay,因为很多事情都变得更好了(比如 this )。

    我能够让它工作,但我需要在 Maven(或 Gradle)构建文件中设置特定的东西,例如由 Spring Boot 管理的 overriding the dependency versions of SD and the core Spring Framework(特别是 thisthis)。请注意this。另请注意我的dependencies

    Gradle 有点棘手,但你可以看到新的构建文件here 并与之前的版本here 进行比较。

    无论如何,下次你在争论依赖版本时,请记住这些事情,这就是为什么首先创建 Spring IO Platform 来管理所有依赖项和依赖项的全部原因可能发生重叠/冲突时的依赖关系(即传递依赖关系)(因为某些传递依赖关系将具有相同的依赖关系)等。

    希望这会有所帮助!

    问候, -j

    【讨论】:

    • 非常感谢您提供如此详细的解释。你绝对是对的,问题是由于 Spring Data Commons 的不兼容版本以及其他 Spring Dependencies 无法与 Spring Boot 1.5.8.RELEASE 和 Spring Data Kay 一起使用。我终于能够使用最新的 GA 版本的 Spring Boot 1.5.8.RELEASE 在 Spring Data Kay 上启动并运行我的应用程序,只需将我的 pom.xml 文件 spring.version 中的以下内容设置为 5.0.1.RELEASE spring-data-releasetrain.version 到 Kay-SR1 spring-shell.version 到 1.2.0.RELEASE
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-08
    • 1970-01-01
    • 2017-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多