在做项目的时候遇到一个坑,使用Redis模板类无法持久化自定义类
注入RedisTemplate对象在指定泛型类型的时候不能直接使用@Autowire,要使用@Resource根据名字注入
因为在SpringBoot中,RedisTemplate是自动配置的,相当于容器中有一个默认的RedisTemplate实例,文档中描述如下:
If you add your own @Bean of any of the auto-configured types, it replaces the default (except in the case of RedisTemplate, when the exclusion is based on the bean name, redisTemplate, not its type).
也就是说,通常情况下,如果针对自动配置类型添加自己的Bean,它将取代默认的,但是RedisTemplate恰好不在"通常情况"之列,因此扫描进入容器之后不能用@Aautowire类型匹配,而是bean的名字,因此用@Resource
@Resource//不能使用@Autowired,如果非要使用,不注明泛型类型即可
private RedisTemplate<String, Object> redisTemplate;
但是在注入成功之后,我再对计算结果序列化的时候报了标题所示的错误,之后实现了Serializable接口仍无济于事,最后发现我的包装类是以内部类的形式存在的,把要序列化的内部类独立出去,问题解决。
/**
* 饼图返回数据元的包装类型
* 由于计算结果数据由本类对象包装,结果需要被Redis序列化保存
* 因此这个包装类必须实现Serializable接口
*
*/
public class DataPackage implements Serializable{
private String name;
private Integer value;
public DataPackage(String name, Integer value) {
super();
= name;
= value;
}
public String getName() {
return name;
}
public void setName(String name) {
= name;
}
public Integer getValue() {
return value;
}
public void setValue(Integer value) {
= value;
}
}