账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    JedisPool 注入spring 为 null
    • 东京的樱花在巴黎飘落2018-04-25 00:00
    27
    0
    最近在项目中(spring)集成 redis 时,在去工厂实例时,一直抱空指针 异常:
    但是单元测试始终正常:
    以下为 redis-config.xml 文件
     <context:property-placeholder location="classpath:properties/redis.properties" ignore-unresolvable="true"/>
    
    
        <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
            <property name="maxTotal" value="${redis.maxTotal}"/>
            <property name="maxIdle" value="${redis.maxIdle}"/>
            <property name="maxWaitMillis" value="${redis.maxWait}"/>
            <property name="testOnBorrow" value="${redis.testOnBorrow}"/>
        </bean>
    
        <!-- 单例模式 默认 -->
        <bean id="connectionFactory" class="redis.clients.jedis.JedisPool">
            <constructor-arg ref="jedisPoolConfig" name="poolConfig"/>
            <constructor-arg name="host" value="${redis.host}"/>
            <constructor-arg name="port" value="${redis.port}"/>
            <constructor-arg name="timeout" value="${redis.timeout}"/>
        </bean>
    
    

    测试代码:

    @Test
        public void redisTest(){
            Jedis jedis=jedisConnectionFactory.getResource();
            jedis.set("123","312312");
            System.out.println(jedis.get("123"));
        }
        

    测试运行结果为:

    312312

    但是在 mybatis 中加入二级缓存抱错

      xxxMapper.xml
      ```xml
       <cache type="extra.cache.RedisCache"/>
       ```
      

    二级缓存接口继承处理...

    @Component
    public class RedisCache implements Cache {
    
        private static final Logger logger= LoggerFactory.getLogger(RedisCache.class);
    
        @Autowired
        private JedisPool jedisConnectionFactory;
    
    
        private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
    
        private final String id;
    
    
        public RedisCache(final String id){
            if(id==null){
                throw new IllegalArgumentException("Cache instances require an ID");
            }
            logger.debug("MybatisRedisCache:id=" + id);
            this.id=id;
        }
    
        /**
         *  获取 id
         * @return
         */
        public String getId() {
            return this.id;
        }
    
        /**
         *  存储数据到 redis 数据库中
         * @param key
         * @param value
         */
        public void putObject(Object key, Object value) {
    
            logger.info("putObject :"+key+"= "+value);
    
            Jedis connection= jedisConnectionFactory.getResource();
            RedisSerializer<Object> serializer=new JdkSerializationRedisSerializer();
            connection.set(serializer.serialize(key),serializer.serialize(value));
            connection.close();
    
        }
    
        /**
         *  从 redis 中获取 数据
         * @param key
         * @return
         */
        public Object getObject(Object key) {
            logger.info("jedisConnectionFactory : "+jedisConnectionFactory);
    
            Jedis connection= jedisConnectionFactory.getResource();
            RedisSerializer<Object> serializer=new JdkSerializationRedisSerializer();
            Object result=serializer.deserialize(connection.get(serializer.serialize(key)));
            connection.close();
            return result;
    
        }

    报的错误如下:打印日志说明为 空对象(JedisPool)

    
      INFO  extra.cache.RedisCache - jedisConnectionFactory : null
    
    Error querying database.  Cause: java.lang.NullPointerException
    ### Cause: java.lang.NullPointerException
    
    1. 初步怀疑为spring 加载顺序的问题,但是采用 SpringContextUtil.getBean("") ,依旧获取不了 该实例

      public class SpringContextUtil implements ApplicationContextAware{...}
    2. 该项目采用多maven结构,同时子maven 打包时,存在一系列问题... 导致子模块之间没有通信
    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 陈龄耀 普通会员 1楼

      JedisPool 注入 Spring 为 null 通常是因为在 Spring 中配置了 @Bean 注解,但 Spring 的 BeanFactory 没有找到这个注解的实例。

      如果你是在 JedisPool 的配置类中使用了 @Bean 注解,你可以尝试以下几种解决方法:

      1. 检查 @Bean 注解的引用:确保你在 @Bean 注解的引用处没有错误,例如:

      java @Bean public JedisPoolConfig jedisPoolConfig() { return new JedisPoolConfig(); }

      1. 检查 BeanFactory 的创建:如果你在使用 Spring 的 BeanFactory,确保它已经被正确地创建。你可以通过以下代码来检查:

      java if (BeanFactory.class.isAssignableFrom(JedisPoolConfig.class)) { // 创建 JedisPoolConfig 对象 JedisPoolConfig config = (JedisPoolConfig) BeanFactory.getBean(JedisPoolConfig.class); }

      1. 检查 JedisPool 的配置:如果你在使用 Spring 的 JedisPool,确保它已经被正确地配置。你可以通过以下代码来检查:

      java JedisPool pool = new JedisPool(config);

      1. 检查 JedisPool 的连接池大小:如果你的 JedisPool 的连接池大小设置为 Integer.MAX_VALUE,你可以尝试增加连接池大小,例如:

      java pool.setMaxTotal(100);

      希望这些方法可以帮助你解决 JedisPool 注入 Spring 为 null 的问题。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部