spring-data-redis用配置类连接时,抛异常Cannot get Jedis connection; nested exception is java.lang.NullPointerEx
2016-03-30 18:24
1111 查看
前提:redis服务器已经运行,且端口号,服务器地址都已经配置正常,但任然抛出无法获取连接异常
原来的代码如下:
其他配置都很正常,但是运行后会抛出空指针异常。
解决方法如下,在return前添加如下代码
如果没用用pool的话,需要用到getShardInfo()方法,而这个方法就是返回一个JedisShardInfo shardInfo。那么这个JedisShardInfo shardInfo在什么时候初始化呢?查看后发现,哈哈在这:
这个方法将在所有的属性被初始化后调用。但是会在init前调用。是spring中InitializingBean接口的方法。spring-data-redis里面实现了它。在这里对shardIndo类进行了初始化。所以,我们只要在代码中添加:
原来的代码如下:
@Bean public JedisConnectionFactory connectionFactory(){ JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(); jedisConnectionFactory.setUsePool(true); jedisConnectionFactory.setPoolConfig(jedisPoolConfig()); jedisConnectionFactory.setHostName(environment.getProperty("redis.host")); jedisConnectionFactory.setPort(Integer.parseInt(environment.getProperty("redis.port"))); return jedisConnectionFactory; }
其他配置都很正常,但是运行后会抛出空指针异常。
Request processing failed; nested exception is org.springframework.data.redis.RedisConnectionFailureException: Cannot get Jedis connection; nested exception is java.lang.NullPointerException
解决方法如下,在return前添加如下代码
jedisConnectionFactory.afterPropertiesSet();看源码便知原因:看jedis如何获取到连接的:
public JedisConnection getConnection() { Jedis jedis = fetchJedisConnector(); JedisConnection connection = (usePool ? new JedisConnection(jedis, pool, dbIndex) : new JedisConnection(jedis, null, dbIndex)); connection.setConvertPipelineAndTxResults(convertPipelineAndTxResults); return postProcessConnection(connection); }我们看fetchJedisConnector()方法:
protected Jedis fetchJedisConnector() { try { if (usePool && pool != null) { return pool.getResource(); } Jedis jedis = new Jedis(getShardInfo()); // force initialization (see Jedis issue #82) jedis.connect(); return jedis; } catch (Exception ex) { throw new RedisConnectionFailureException("Cannot get Jedis connection", ex); } }
如果没用用pool的话,需要用到getShardInfo()方法,而这个方法就是返回一个JedisShardInfo shardInfo。那么这个JedisShardInfo shardInfo在什么时候初始化呢?查看后发现,哈哈在这:
public void afterPropertiesSet() { if (shardInfo == null) { shardInfo = new JedisShardInfo(hostName, port); if (StringUtils.hasLength(password)) { shardInfo.setPassword(password); } if (timeout > 0) { setTimeoutOn(shardInfo, timeout); } } if (usePool) { this.pool = createPool(); } }
这个方法将在所有的属性被初始化后调用。但是会在init前调用。是spring中InitializingBean接口的方法。spring-data-redis里面实现了它。在这里对shardIndo类进行了初始化。所以,我们只要在代码中添加:
jedisConnectionFactory.afterPropertiesSet();这句就可以啦。再运行一次,连接成功!
相关文章推荐
- 基于redis排行榜的实战总结
- redis实战课题
- Redis集群部署文档(Ubuntu15.10系统)
- java redis 基本操作
- cengos 安装redis 并将redis启动添加为系统服务
- Redis缓存
- redis配置文件redis.conf详细说明
- redis启动
- Redis让Spark数据分析速度提升45倍(留作机器学习使用)
- 超强、超详细Redis数据库入门教程
- 利用redis实现分布式环境下的限频
- Redis持久化
- windows配置phpredis
- redis基础
- 基于注解的SpringAOP Redis缓存技术
- MongoDB和Redis区别
- redis在centOS系统上的集群搭建
- 2016.3.30 redis的配置密码 和进入 redis的流程
- Redis开源代码读书笔记八(anet模块)
- Redis事务使用