我正在尝试使用spring数据将以下类的对象存储在redis中。
public abstract class MyClass implements Serializable {
@Id
private String id;
private Int count;
private Map<String, Object> data;
}
存储在Map中的Object可以是从String到Map和List的任何对象,并且不可能事先说明它将是什么。我很难做到这一点,因为Redis在尝试序列化和反序列化数据时不断抛出错误。
因此,后来我决定将任何类型的数据转换为String,然后再将其传递给Redis进行存储。然而,我仍然有一个用例,其中我想存储一个Map,该Map的值为字符串列表。在存储数据时,这与新方法配合得很好。但当我试图读取它时,它是从列表中返回的,是列表中的一个单字节值,而不是字符串。
这是我的redis配置。
@Configuration
public class RedisConfig {
@Bean
JedisConnectionFactory jedisConnectionFactory() {
RedisStandaloneConfiguration standaloneConfig = new RedisStandaloneConfiguration(
HOST_NAME,
PORT
);
JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(standaloneConfig);
return new JedisConnectionFactory();
}
@Bean
RedisTemplate<String, Object> redisTemplate(JedisConnectionFactory jedisConnectionFactory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(jedisConnectionFactory);
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
template.afterPropertiesSet();
return template;
}
@Bean
RedisCustomConversions redisCustomConversions(
MapToBytesConverter m2bConverter, BytesToMapConverter b2mConverter
) {
return new RedisCustomConversions(Arrays.asList(
m2bConverter,
b2mConverter
));
}
这是两个转换器类。
@Component
@ReadingConverter
public class BytesToMapConverter implements Converter<byte[], Map<String, Object>> {
private final RedisSerializer<Object> serializer;
public BytesToMapConverter() {
serializer = new GenericJackson2JsonRedisSerializer();
}
@Override
public Map<String, Object> convert(byte[] source) {
return (Map<String, Object>) serializer.deserialize(source);
}
}
@Component
@WritingConverter
public class MapToBytesConverter implements Converter<Map<String, Object>, byte[]> {
private final RedisSerializer<Object> serializer;
public MapToBytesConverter() {
serializer = new GenericJackson2JsonRedisSerializer();
}
@Override
public byte[] convert(Map<String, Object> source) {
return serializer.serialize(source);
}
}
存储库只是一个crudrepository。
@Repository
public interface MyClassRepository extends CrudRepository<MyClass, String>{
}
你能帮我弄清楚我在这里缺了什么吗?提前谢谢。