1 回答
TA贡献1851条经验 获得超3个赞
基本上,Redis 存储库使用RedisKeyValueTemplate底层将数据存储为键(Id)和值对。所以除非你直接使用它,否则你的配置RedisTemplate将不起作用。
因此,您的一种方法是RedistTemplate直接使用,这样的东西对您有用。
@Service
public class TestService {
@Autowired
private RedisTemplate redisTemplate;
public void saveIt(TestObject testObject){
ValueOperations<ObjectId, TestObject> values = redisTemplate.opsForValue();
values.set(testObject.testId, testObject);
}
}
因此,上面的代码将使用您的配置并使用 Jackson 作为键和值的映射器在 Redis 中生成字符串对。
但是,如果您想通过以下方式使用 Redis 存储库,则需要为from 和 toCrudRepository创建读写转换器,并将它们注册为自定义 Redis 转换。ObjectIdStringbyte[]
ObjectId因此,让我们为<->创建读写转换器String
读者
@Component
@ReadingConverter
@Slf4j
public class RedisReadingStringConverter implements Converter<String, ObjectId> {
private ObjectMapper objectMapper = new ObjectMapper();
@Override
public ObjectId convert(String source) {
try {
return objectMapper.readValue(source, ObjectId.class);
} catch (IOException e) {
log.warn("Error while converting to ObjectId.", e);
throw new IllegalArgumentException("Can not convert to ObjectId");
}
}
}
作家
@Component
@WritingConverter
@Slf4j
public class RedisWritingStringConverter implements Converter<ObjectId, String> {
private ObjectMapper objectMapper = new ObjectMapper();
@Override
public String convert(ObjectId source) {
try {
return objectMapper.writeValueAsString(source);
} catch (JsonProcessingException e) {
log.warn("Error while converting ObjectId to String.", e);
throw new IllegalArgumentException("Can not convert ObjectId to String");
}
}
}
以及 ObjectId <-> byte[] 的读写转换器
作家
@Component
@WritingConverter
public class RedisWritingByteConverter implements Converter<ObjectId, byte[]> {
Jackson2JsonRedisSerializer<ObjectId> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(ObjectId.class);
@Override
public byte[] convert(ObjectId source) {
return jackson2JsonRedisSerializer.serialize(source);
}
}
读者
@Component
@ReadingConverter
public class RedisReadingByteConverter implements Converter<byte[], ObjectId> {
Jackson2JsonRedisSerializer<ObjectId> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(ObjectId.class);
@Override
public ObjectId convert(byte[] source) {
return jackson2JsonRedisSerializer.deserialize(source);
}
}
最后添加 Redis 自定义对话。只需将代码放入RedisConfiguration
@Bean
public RedisCustomConversions redisCustomConversions(RedisReadingByteConverter readingConverter,
RedisWritingByteConverter redisWritingConverter,
RedisWritingStringConverter redisWritingByteConverter,
RedisReadingStringConverter redisReadingByteConverter) {
return new RedisCustomConversions(Arrays.asList(readingConverter, redisWritingConverter, redisWritingByteConverter, redisReadingByteConverter));
}
因此,现在在创建转换器并将其注册为自定义 Redis 转换器后,您RedisKeyValueTemplate可以使用它们,并且您的代码应该按预期工作。
添加回答
举报