2017-12-20 31 views
1

redis로 작업하기 위해 spring-data-redis를 spring-boot 응용 프로그램에서 사용하려고합니다. 다음과 같이 나는 JedisConnectionFactory를 만드는 오전 :NoSuchMethodError : org.springframework.data.repository.config.RepositoryConfigurationSource.getAttribute

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:+') 
} 

이 때문에 스프링 부팅에 대한 호환되지 않는 종속 버전의인가 봄 데이터 redis? 어떤 버전을 사용할 지 어떻게 알 수 있습니까?

+0

'spring-boot-starter'의 버전을 제거하십시오. 'spring-web' 의존성을'spring-boot-starter-web'으로 바꾸고'spring-data-redis' 의존성을'spring-boot-startter-data-redis' 의존성으로 대체하십시오. 그렇게하면 호환되는 버전을 사용할 수 있습니다. 또한 봄 부팅 시동자가 그 일을 처리 할 때'org.slf4j' 의존성을 필요로하지 않습니다. –

답변

3

문제점은 Spring Boot, Spring Data Commons 및 Spring Data Redis 사이의 비 호환성으로 인한 것입니다.

스프링 부트가 Gradle plugin을 사용할 때 어떤 버전도 지정하지 않는 것이 좋습니다. 스프링 부트는 의존성에 대한 의존성 관리가 제공되므로 참조 라이브러리 간의 호환성을 보장합니다.

일반적으로 스프링 부트는 종속성 버전의 마스터 여야합니다. Spring Data 2.x는 Spring Boot 1.x와 호환되지 않습니다. 최근의 Spring Boot milestone (현재 2.0 M7) 또는 Spring Data Redis를 1.7.x로 다운 그레이드하십시오.

+0

배포 환경 요구 사항으로 인해 스프링 부트를 업그레이드 할 수 없습니다 (스프링 부트 2.0에는 gradle 4. +가 필요하며 3.2.x로 작업 중입니다). 또한 필요한 기능을 일부 잃어 버렸기 때문에 스프링 데이터 redis를 다운 그레이드 할 수 없었습니다. 그래서 나는 양상추 위에 내 고객을 쓰게되었다. 도와 주셔서 감사합니다. – user87407

1

많은 사람들이이 프레임 워크의 이점을 얻지 만, 때로는 종속성 문제를 해결하는 데 더 많은 시간이 소요됩니다. 알려진 문제이며 다음과 같은 문제가있었습니다. ... 스프링 데이터 JPA-2.0.2.RELEASE.jar을 2.0.2 및 파일의 제거 -

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

나는 1 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> 

스프링 데이터 JPA-2.0.2.RELEASE.jar (부모 충돌)

스프링 데이터 JPA-1.10.5.RELEASE.jar (해결 버전)

이 오류가 발생하면 모든 사용자가 서로 다른 버전을 사용할 수 있습니다. 하지만 의존성 버전을 먼저 확인하면 더 빠를 것입니다.