02
06
19
01
请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

jedisKeys空指针问题

老师,我在util文件下
@Autowired
private JedisUtil.Keys jedisKeys;
我发现jedisKeys是空的,但是我在service文件下写,我发现是获取到的,这个为什么呢。

正在回答 回答被采纳积分+3

插入代码

3回答

翔仔 2019-11-27 01:19:18

同学好,如果是springboot的话,不能这么定义的呢,毕竟你bean的名字并没有叫做JedisUtil.Keys,所以@Autowired找不到对应的bean,你可以参考我的进行定义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
package com.imooc.o2o.config.redis;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
 
import com.imooc.o2o.cache.JedisPoolWriper;
import com.imooc.o2o.cache.JedisUtil;
 
import redis.clients.jedis.JedisPoolConfig;
 
/**
 * spring-redis.xml里的配置
 
 * @author xiangze
 *
 */
@Configuration
public class RedisConfiguration {
    @Value("${redis.hostname}")
    private String hostname;
    @Value("${redis.port}")
    private int port;
    @Value("${redis.pool.maxActive}")
    private int maxTotal;
    @Value("${redis.pool.maxIdle}")
    private int maxIdle;
    @Value("${redis.pool.maxWait}")
    private long maxWaitMillis;
    @Value("${redis.pool.testOnBorrow}")
    private boolean testOnBorrow;
 
    @Autowired
    private JedisPoolConfig jedisPoolConfig;
    @Autowired
    private JedisPoolWriper jedisWritePool;
    @Autowired
    private JedisUtil jedisUtil;
 
    /**
     * 创建redis连接池的设置
     
     * @return
     */
    @Bean(name = "jedisPoolConfig")
    public JedisPoolConfig createJedisPoolConfig() {
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        // 控制一个pool可分配多少个jedis实例
        jedisPoolConfig.setMaxTotal(maxTotal);
        // 连接池中最多可空闲maxIdle个连接 ,这里取值为20,
        // 表示即使没有数据库连接时依然可以保持20空闲的连接,
        // 而不被清除,随时处于待命状态。
        jedisPoolConfig.setMaxIdle(maxIdle);
        // 最大等待时间:当没有可用连接时,
        // 连接池等待连接被归还的最大时间(以毫秒计数),超过时间则抛出异常
        jedisPoolConfig.setMaxWaitMillis(maxWaitMillis);
        // 在获取连接的时候检查有效性
        jedisPoolConfig.setTestOnBorrow(testOnBorrow);
        return jedisPoolConfig;
    }
 
    /**
     * 创建Redis连接池,并做相关配置
     
     * @return
     */
    @Bean(name = "jedisWritePool")
    public JedisPoolWriper createJedisPoolWriper() {
        JedisPoolWriper jedisPoolWriper = new JedisPoolWriper(jedisPoolConfig, hostname, port);
        return jedisPoolWriper;
    }
 
    /**
     * 创建Redis工具类,封装好Redis的连接以进行相关的操作
     
     * @return
     */
    @Bean(name = "jedisUtil")
    public JedisUtil createJedisUtil() {
        JedisUtil jedisUtil = new JedisUtil();
        jedisUtil.setJedisPool(jedisWritePool);
        return jedisUtil;
    }
 
    /**
     * Redis的key操作
     
     * @return
     */
    @Bean(name = "jedisKeys")
    public JedisUtil.Keys createJedisKeys() {
        JedisUtil.Keys jedisKeys = jedisUtil.new Keys();
        return jedisKeys;
    }
 
    /**
     * Redis的Strings操作
     
     * @return
     */
    @Bean(name = "jedisStrings")
    public JedisUtil.Strings createJedisStrings() {
        JedisUtil.Strings jedisStrings = jedisUtil.new Strings();
        return jedisStrings;
    }
}


0 回复 有任何疑惑可以回复我~
  • 提问者 qq_淡定_49 #1
    老师,如果在静态static方法里面就无法获取到,在静态方法里面怎么获取呢
    回复 有任何疑惑可以回复我~ 2020-05-08 15:29:27
  • 翔仔 回复 提问者 qq_淡定_49 #2
    同学可以看看这个 https://blog.csdn.net/mononoke111/article/details/81088472
    这个是static的获取方式
    回复 有任何疑惑可以回复我~ 2020-05-08 21:19:42
  • 提问者 qq_淡定_49 回复 翔仔 #3
    老师我是这么写的,但还是报了空指针错误,一时想不明白,还请老师指点下
    @Component
    public class StrongCrawler {
    
        private static JedisUtil.Strings jedisStrings;
    
        @Autowired
        public void setJedisStrings(JedisUtil.Strings jedisStrings) {
            this.jedisStrings = jedisStrings;
        }
    
        public static void main(String[] args) {
            try {
                jedisStrings.set("xx", "xx");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    回复 有任何疑惑可以回复我~ 2020-05-09 16:07:16
提问者 qq_淡定_49 2019-11-26 11:33:08

老师,我用的是springboot写的,我看配置文件RedisConfiguration并没有扫描package,我的理解是@Configuration就会自动注入spring容器,那么在util 文件类下使用

@Autowired private 

JedisUtil.Keys jedisKeys;

应该能获取到才对,这让我感觉困惑,如果像老师说的package没扫描到,那我应该怎么做才能获取到,当然我目前解决方法是在servcie把jedisKeys当参数传过来使用,我想了解原理,请老师再解答下。

0 回复 有任何疑惑可以回复我~
翔仔 2019-11-26 00:57:34

同学好,主要看你的对应的package是否被扫描到了,没扫描到的话不会注入呢

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号