问题描述
springboot2.*集成redis时,redis工具类中的redisTemplate注入后总是为空。
问题代码还原:
1、工具类定义成静态工具类,@Resource注入redisTemplate
/**
* Redis工具类
*/
public final class RedisUtil {
@Resource
private RedisTemplate<String, Object> redisTemplate;
// =============================common============================
/**
* 指定缓存失效时间
* @param key 键
* @param time 时间(秒)
* @return
*/
public boolean expire(String key, long time) {
try {
if (time > 0) {
redisTemplate.expire(key, time, TimeUnit.SECONDS); //redisTemplate为空
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
//其它代码略
}
在使用该类时会发现redisTemplate一直为空
解决方案:
1、将工具类注入到spring容器
/**
* Redis工具类
*/
//注入spring容器
public final class RedisUtil {
@Resource
private RedisTemplate<String, Object> redisTemplate;
// =============================common============================
/**
* 指定缓存失效时间
* @param key 键
* @param time 时间(秒)
* @return
*/
public boolean expire(String key, long time) {
try {
if (time > 0) {
redisTemplate.expire(key, time, TimeUnit.SECONDS); //redisTemplate为空
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
//其它代码略
}
2、再将工具类bean注入调用方
@RestController
public class HelloController {
@Resource
private RedisUtil redisUtil; //工具类bean注入调用方
@RequestMapping("/")
public String index() {
String cacheKey="test001";
String val="test001val";
//RedisUtil redisUtil = new RedisUtil();
Date date = DateUtil.getNowDate();
String strDate = DateUtil.dateToStr(date);
long ts=0;
try {
ts = DateUtil.dateToStampInt(strDate)+100000;
} catch (ParseException e) {
e.printStackTrace();
}
redisUtil.set(cacheKey,val,ts);
String testval =redisUtil.get(cacheKey).toString();
return testval;
//return "Hello Spring Boot 2.0! test";
}
}
至此问题解决
因为是用了自定义的 RedisTemplate<String, Object>,用springboot自带的 RedisTemplate<Object, Object>应该没有该问题,没有测试过 :)
--- end ---