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可以使用它們,并且您的代碼應該按預期工作。
添加回答
舉報