NoSuchMethodError:org.springframework.data.repository.config.RepositoryConfigurationSource.getAttrib

Posted

技术标签:

【中文标题】NoSuchMethodError:org.springframework.data.repository.config.RepositoryConfigurationSource.getAttribute【英文标题】:NoSuchMethodError: org.springframework.data.repository.config.RepositoryConfigurationSource.getAttribute 【发布时间】:2018-06-03 02:01:51 【问题描述】:

我正在尝试在 spring-boot 应用程序中使用 spring-data-redis 来使用 redis。我正在创建JedisConnectionFactory 如下:

RedisStandaloneConfiguration configuration = new RedisStandaloneConfiguration();
configuration.setHostName("localhost");
configuration.setPort(6379);
JedisConnectionFactory connectionFactory = new JedisConnectionFactory(configuration);

抛出异常:

Exception in thread "main" java.lang.NoSuchMethodError: org.springframework.data.repository.config.RepositoryConfigurationSource.getAttribute(Ljava/lang/String;)Ljava/util/Optional;
    at org.springframework.data.redis.repository.configuration.RedisRepositoryConfigurationExtension.registerBeansForRoot(RedisRepositoryConfigurationExtension.java:88)
    at org.springframework.data.repository.config.RepositoryConfigurationDelegate.registerRepositoriesIn(RepositoryConfigurationDelegate.java:118)
    at org.springframework.boot.autoconfigure.data.AbstractRepositoryConfigurationSourceSupport.registerBeanDefinitions(AbstractRepositoryConfigurationSourceSupport.java:59)
    at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsFromRegistrars(ConfigurationClassBeanDefinitionReader.java:352)
    at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForConfigurationClass(ConfigurationClassBeanDefinitionReader.java:143)
    at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitions(ConfigurationClassBeanDefinitionReader.java:116)
    at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:336)
    at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:246)
    at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:270)
    at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:93)
    at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:686)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:524)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:761)
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:371)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:315)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1186)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1175)
    at com.test.redis.RedisTesterApplication.main(RedisTesterApplication.java:11)

我的 build.gradle:

dependencies 
    compile('org.springframework.data:spring-data-redis:2.0.2.RELEASE')
    compile('redis.clients:jedis:2.9.0')
    compile('org.json:json:20160810')
    compile('org.springframework.boot:spring-boot-starter:1.4.2.RELEASE')
    compile("org.springframework:spring-web")
    compile('org.slf4j:slf4j-api:+')

是不是因为spring-boot和spring-data-redis的依赖版本不兼容?我如何知道要使用哪些版本?

【问题讨论】:

删除spring-boot-starter 的版本。将spring-web 依赖替换为spring-boot-starter-web,并将spring-data-redis 依赖替换为spring-boot-starter-data-redis 依赖。这样你就有了兼容的版本。你也不需要 org.slf4j 依赖,spring boot 启动器会处理这个问题。 【参考方案1】:

您的问题来自 Spring Boot、Spring Data Commons 和 Spring Data Redis 之间的不兼容。

理想情况下,您在使用 Spring Boot 的 Gradle plugin 时不要指定任何版本,因为 Spring Boot 为您的依赖项提供了依赖项管理,以确保跨引用库的兼容性。

一般来说,Spring Boot 应该是依赖版本的主控。 Spring Data 2.x 与 Spring Boot 1.x 不兼容。请升级到最近的 Spring Boot 里程碑(截至目前为 2.0 M7)或将 Spring Data Redis 降级到 1.7.x。

【讨论】:

由于部署环境要求,我无法升级 spring-boot(Spring Boot 2.0 需要 gradle 4.+,我们正在使用 3.2.x)。我也不能降级 spring-data-redis 因为我失去了一些必需的功能。所以我最终在生菜上写了我自己的客户端。感谢您的帮助。【参考方案2】:

尽管很多人从这个框架中受益,但有时需要更多时间来解决它的依赖关系。 这是一个已知问题,我遇到了与以下相同的问题。

java.lang.NoSuchMethodError: org.springframework.data.repository.config.RepositoryConfigurationSource.getAttribute(Ljava/lang/String;)Ljava/util/Optional; 在 org.springframework.data.jpa.repository.config.JpaRepositoryConfigExtension.postProcess(JpaRepositoryConfigExtension.java:125) ~[spring-data-jpa-2.0.2.RELEASE.jar:2.0.2.RELEASE]

我注意到第一个 jar 文件及其版本 - 2.0.2 并删除了文件 .. spring-data-jpa-2.0.2.RELEASE.jar。之后我让父母决定它的依赖关系,它下载了 1.10.5 版本。

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.4.2.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
 ....
</dependencies>

spring-data-jpa-2.0.2.RELEASE.jar(与父级冲突)

spring-data-jpa-1.10.5.RELEASE.jar(已解决版本)

每个人遇到此错误时可能有不同的版本。但是如果你先仔细检查它的依赖版本会更快。

【讨论】:

【参考方案3】:

您需要将 spring-boot 版本更新到 2.0.0+。

dependencies 
    compile('org.springframework.data:spring-data-redis:2.0.2.RELEASE')
    compile('redis.clients:jedis:2.9.0')
    compile('org.json:json:20160810')
    compile('org.springframework.boot:spring-boot-starter:2.0.0.RELEASE')
    compile("org.springframework:spring-web")
    compile('org.slf4j:slf4j-api:+')

这将使用spring-core 5.0.0+,与此版本的spring-data-redis兼容。

【讨论】:

【参考方案4】:

尝试调用方法 org.springframework.data.repository.config.RepositoryConfigurationSource.getRequiredAttribute(Ljava/lang/String;Ljava/lang/Class;)Ljava/lang/Object;但它不存在。它的类 org.springframework.data.repository.config.RepositoryConfigurationSource 可从以下位置获得:

jar:file:/C:/Users/1002899/.m2/repository/org/springframework/data/spring-data-commons/2.1.3.RELEASE/spring-data-commons-2.1.3.RELEASE.jar!/org/springframework/data/repository/config/RepositoryConfigurationSource.class

它是从以下位置加载的:

file:/C:/Users/1002899/.m2/repository/org/springframework/data/spring-data-commons/2.1.3.RELEASE/spring-data-commons-2.1.3.RELEASE.jar

行动:

更正应用程序的类路径,使其包含一个兼容的 org.springframework.data.repository.config.RepositoryConfigurationSource 版本

【讨论】:

以上是关于NoSuchMethodError:org.springframework.data.repository.config.RepositoryConfigurationSource.getAttrib的主要内容,如果未能解决你的问题,请参考以下文章

NoSuchMethodError (NoSuchMethodError: 方法 'map' 在 null 上被调用

NoSuchMethodError(NoSuchMethodError:方法'[]'在null上被调用。接收者:null尝试调用:[](“title”))

NoSuchMethodError:null 上的无效成员:'length'

NoSuchMethodError,小部件库捕获的异常

NoSuchMethodError - 颤振[重复]

接缝测试 NoSuchMethodError