无法获得redisTemplate for Spring数据redis的连接

时间:2015-05-26 01:03:17

标签: spring-data spring-data-redis

我正在尝试使用Jedis使用Spring数据Redis将消息发布到频道。这是一个非常简单的Java配置:

@Bean(name="jedisConnectionFactory")
JedisConnectionFactory jedisConnectionFactory() {
    JedisConnectionFactory factory = new JedisConnectionFactory();
    factory.setHostName(redisHostName);
    factory.setPort(redisPort);
    factory.setUsePool(true);
    return factory;
}

@Bean(name="redisTemplate")
RedisTemplate<Object, Object> redisTemplate() {
    RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<Object, Object>();
    redisTemplate.setConnectionFactory(jedisConnectionFactory());
    return redisTemplate;
}

其中redisPort = 6379,redisHostName =“localhost”。

当我运行以下测试时:

 @Test
public void testRedis(){
    ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
    RedisTemplate<Object,Object> redisTemplate = (RedisTemplate<Object, Object>) context.getBean("redisTemplate");
    redisTemplate.convertAndSend("test", "123");
}

我得到以下stacktrace:

java.lang.ExceptionInInitializerError
at org.springframework.data.redis.connection.jedis.JedisConnectionFactory.getConnection(JedisConnectionFactory.java:252)
at org.springframework.data.redis.connection.jedis.JedisConnectionFactory.getConnection(JedisConnectionFactory.java:58)
at org.springframework.data.redis.core.RedisConnectionUtils.doGetConnection(RedisConnectionUtils.java:128)
at org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:91)
at org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:78)
at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:178)
at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:153)
at org.springframework.data.redis.core.RedisTemplate.convertAndSend(RedisTemplate.java:676)
at com.jobvite.realtimeanalytics.redis.RedisTest.testRedis(RedisTest.java:22)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:73)
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:82)
at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:73)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:224)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:83)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:68)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:163)
at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:252)
at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:141)
at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:112)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189)
at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:165)
at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:85)
at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:115)
at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:75) 
Caused by: java.lang.NullPointerException
at org.springframework.util.ReflectionUtils.makeAccessible(ReflectionUtils.java:443)
at org.springframework.data.redis.connection.jedis.JedisConnection.<clinit>(JedisConnection.java:108)
... 44 more

11 个答案:

答案 0 :(得分:12)

此问题是由Jedis版本(2.7.2)与Spring Data Redis(1.5.0.RELEASE)不兼容引起的。在我受到这篇文章和评论的启发之前,我用了3天面对同样的问题。 Jedis版本(2.6.2)运行正常(虽然我在我的程序中遇到了其他错误,但至少它有一些进展而不是相同的错误消息)!

感谢。

答案 1 :(得分:5)

原来我使用的是Jedis 2.7.2,但Spring Data Redis 1.5.0似乎与Jedis 2.6.2兼容。我希望文档在某种程度上更加清晰。

答案 2 :(得分:2)

兼容版本:

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.7.0</version>
</dependency>
<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-redis</artifactId>
    <version>1.5.0.RELEASE</version>
</dependency>

答案 3 :(得分:1)

版本,我遇到了同样的问题,这个spring-data-redis 1.5.0 pom

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.springframework.data</groupId>
  <artifactId>spring-data-redis</artifactId>
  <version>1.5.0.RELEASE</version>
  <name>Spring Data Redis</name>
  <description>Spring Data Redis</description>
  <url>http://github.com/spring-projects/spring-data-redis</url>
  <organization>
    <name>Pivotal Software, Inc.</name>
    <url>http://projects.spring.io/spring-data-redis</url>
  </organization>
  <licenses>
    <license>
      <name>The Apache Software License, Version 2.0</name>
      <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
      <distribution>repo</distribution>
    </license>
  </licenses>
  <developers>
    <developer>
      <id>costin</id>
      <name>Costin Leau</name>
      <email>cleau@vmware.com</email>
      <properties>
        <twitter>costinl</twitter>
      </properties>
    </developer>
    <developer>
      <id>jencompgeek</id>
      <name>Jennifer Hickey</name>
      <properties>
        <twitter>jencompgeek</twitter>
      </properties>
    </developer>
    <developer>
      <id>christophstrobl</id>
      <name>Christoph Strobl</name>
      <properties>
        <twitter>stroblchristoph</twitter>
      </properties>
    </developer>
    <developer>
      <id>thomasdarimont</id>
      <name>Thomas Darimont</name>
      <properties>
        <twitter>thomasdarimont</twitter>
      </properties>
    </developer>
  </developers>
  <scm>
    <connection>scm:git:git://github.com/spring-projects/spring-data-redis</connection>
    <developerConnection>scm:git:git://github.com/spring-projects/spring-data-redis</developerConnection>
    <url>http://github.com/spring-projects/spring-data-redis</url>
  </scm>
  <dependencies>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-oxm</artifactId>
      <version>4.0.9.RELEASE</version>
      <scope>compile</scope>
      <optional>true</optional>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>4.0.9.RELEASE</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.codehaus.jackson</groupId>
      <artifactId>jackson-mapper-asl</artifactId>
      <version>1.8.8</version>
      <scope>compile</scope>
      <optional>true</optional>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context-support</artifactId>
      <version>4.0.9.RELEASE</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-tx</artifactId>
      <version>4.0.9.RELEASE</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.jredis</groupId>
      <artifactId>jredis-core-ri</artifactId>
      <version>06052013</version>
      <scope>compile</scope>
      <optional>true</optional>
    </dependency>
    <dependency>
      <groupId>redis.clients</groupId>
      <artifactId>jedis</artifactId>
      <version>2.6.2</version>
      <scope>compile</scope>
      <optional>true</optional>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aop</artifactId>
      <version>4.0.9.RELEASE</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>4.0.9.RELEASE</version>
      <scope>compile</scope>
      <exclusions>
        <exclusion>
          <artifactId>commons-logging</artifactId>
          <groupId>commons-logging</groupId>
        </exclusion>
      </exclusions>
    </dependency>
    <dependency>
      <groupId>commons-beanutils</groupId>
      <artifactId>commons-beanutils-core</artifactId>
      <version>1.8.3</version>
      <scope>compile</scope>
      <optional>true</optional>
    </dependency>
    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-pool2</artifactId>
      <version>2.2</version>
      <scope>compile</scope>
      <optional>true</optional>
    </dependency>
    <dependency>
      <groupId>com.github.spullara.redis</groupId>
      <artifactId>client</artifactId>
      <version>0.7</version>
      <scope>compile</scope>
      <optional>true</optional>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.5.1</version>
      <scope>compile</scope>
      <optional>true</optional>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>1.7.10</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>com.lambdaworks</groupId>
      <artifactId>lettuce</artifactId>
      <version>2.3.3</version>
      <scope>compile</scope>
      <optional>true</optional>
    </dependency>
    <dependency>
      <groupId>org.jredis</groupId>
      <artifactId>jredis-core-api</artifactId>
      <version>06052013</version>
      <scope>compile</scope>
      <optional>true</optional>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
      <version>2.5.1</version>
      <scope>compile</scope>
      <optional>true</optional>
    </dependency>
  </dependencies>
</project>

答案 4 :(得分:1)

Navin Viswanath,谢谢您的解决方案!你是如何使用文档或调试找到它的?

对于那些使用Gradle的人来说,这是我的组合:

<强>版本

  • Redis 3.0.2
  • Jedis 2.7.2
  • Spring Data Redis 1.6.0 M1(在maven central中不可用,因为它的里程碑版本 - 添加http://repo.spring.io/milestone/ repo)

<强>的build.gradle

repositories {
  mavenCentral()
  maven { url 'http://repo.spring.io/release/' }
  maven { url 'http://repo.spring.io/milestone/' }
}

dependencies {
  compile group: 'redis.clients', name: 'jedis', version: '2.7.2'
  compile group: 'org.springframework.data', name: 'spring-data-redis', version: '1.6.0.M1'
}

请注意,Spring Data Redis 1.6.0.M1一旦发布就会被删除,您需要在发布时将其更改为1.6.0.RELEASE

所以,我在这里检查了版本兼容性:https://github.com/spring-projects/spring-data-redis/blob/master/gradle.properties并在此处找到了相关的JIRA票证:https://jira.spring.io/browse/DATAREDIS-396

答案 5 :(得分:1)

我也遇到过类似的问题。我做了一些研究,发现它是由于罐子冲突造成的。

我在我的应用程序中使用的

兼容版是:

<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-redis</artifactId>
    <version>1.8.10.RELEASE</version>
</dependency>
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.9.0</version>
</dependency>

或者,如果您使用 spring boot ,只需添加以下依赖项。 Spring boot非常智能,可以自动解决这些问题。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

我希望它有所帮助!!

答案 6 :(得分:1)

spring-boot-starter-data-redis 2.0.4也有类似的问题

当我在pom.xml应用程序中将jedis隐式依赖项以某种方式起作用时

    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
        <version>2.9.0</version>
    </dependency>

eclipse抱怨“复制受管版本”,但其他所有方法都起作用

答案 7 :(得分:0)

对于那些使用Spring-boot-starter-data-redis

的人

可以按如下方式输入永久性修复:

  1. 确定spring-boot-starter-data-redis的版本。在 eclipse,你可以将鼠标悬停在pom.xml中的依赖项上 文件。它会告诉你你正在使用的版本。
  2. 导航到maven存储库中的该版本目录。
  3. 编辑pom文件并添加所需的redis客户端版本号。在本例中,版本为2.6.2.RELEASE 1.50 of spring-boot-starter-data-redis。在这种情况下,我必须添加<version>2.6.2.RELEASE</version
  4. 在IDE中,刷新整个项目。要在eclipse或STS中执行此操作,请单击项目名称 - >右键单击选择maven-&gt;更新项目
  5. 检查你的maven依赖列表,jedis版本现在应该是2.6.2。
  6. 编译项​​目。
  7. 使用jar或7-zip等打开.war存档。在WEB-INF下找到lib目录并验证是否存在jedis-2.6.2。
  8. 这应解决问题。

答案 8 :(得分:0)

兼容版本:

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
        <version>2.0.4.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
        <version>2.9.0</version>
</dependency>

答案 9 :(得分:0)

您可以从下面的波纹管链接https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redis/1.5.9.RELEASE

中找到与jedis maven版本兼容的spring数据maven版本。

enter image description here

答案 10 :(得分:0)

自 2019 年 7 月起,Spring Boot 2.X 与 Jedis 3.X 兼容(有关详细信息,请参阅 Upgrade to Jedis 3.1.0)。 对于使用Gradle的人,示例如下:

build.gradle

plugins {
    id 'org.springframework.boot' version '2.3.2.RELEASE'
    id 'io.spring.dependency-management' version '1.0.8.RELEASE'
    id 'java'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-redis'
    implementation 'redis.clients:jedis:3.1.0'
}