J'essaie d'utiliser Spring-Data-Redis dans une application Spring-Boot pour travailler avec Redis. Je crée JedisConnectionFactory
comme suit:
RedisStandaloneConfiguration configuration = new RedisStandaloneConfiguration();
configuration.setHostName("localhost");
configuration.setPort(6379);
JedisConnectionFactory connectionFactory = new JedisConnectionFactory(configuration);
Il jette l'exception:
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)
Mon 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:+')
}
Est-ce à cause de versions de dépendance incompatibles pour spring-boot et spring-data-redis? Comment savoir quelles versions utiliser?
Votre problème provient d'incompatibilités entre Spring Boot, Spring Data Commons et Spring Data Redis.
Idéalement, vous ne spécifiez aucune version lorsque vous utilisez le plugin Gradle de Spring Boot, car Spring Boot inclut une gestion des dépendances pour vos dépendances, assurant ainsi la compatibilité entre les bibliothèques de références.
En général, Spring Boot devrait être votre maître pour les versions de dépendance. Spring Data 2.x n'est pas compatible avec Spring Boot 1.x. Effectuez une mise à niveau vers un jalon Spring Boot récent (2.0 M7 dès maintenant) ou rétrogradez Spring Data Redis à 1.7.x.
Même si de nombreuses personnes bénéficient de ce cadre, il faut parfois plus de temps pour dépanner ses dépendances. C'est un problème connu et j'ai eu le même problème que ci-dessous.
Java.lang.NoSuchMethodError: org.springframework.data.repository.config.RepositoryConfigurationSource.getAttribute (Ljava/lang/String;) Ljava/util/Facultatif; at org.springframework.data.jpa.repository.config.JpaRepositoryConfigExtension.postProcess (JpaRepositoryConfigExtension.Java:125) ~ [spring-data-jpa-2.0.2.RELEASE.jar: 2.0.2.RELEASE]
J'ai fait attention au 1er fichier jar et à sa version - 2.0.2 et j'ai retiré le fichier .. spring-data-jpa-2.0.2.RELEASE.jar. Après cela, j'ai laissé le parent décider de ses dépendances et il a téléchargé la version 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 (conflit avec le parent)
spring-data-jpa-1.10.5.RELEASE.jar (version résolue)
Tout le monde peut avoir des versions différentes quand ils rencontrent cette erreur. Mais ce serait plus rapide si vous vérifiez d'abord avec la version de ses dépendances.
Vous devez mettre à jour votre version de spring-boot vers la version 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:+')
}
Cela utilisera spring-core 5.0.0+, qui est compatible avec cette version de spring-data-redis.