在spring-data-redis中,我们如何配置可以从Spring启动应用程序或配置中自动连接/注入的自定义转换器。
我从spring data redis文档中读到了@ReadingConverter和@WritingConverter。从该文档中,不清楚如何配置它们。 https://github.com/spring-projects/spring-data-redis/blob/master/src/main/asciidoc/reference/redis-repositories.adoc#redis.repositories.indexes
有谁知道怎么做?
答案 0 :(得分:4)
您必须声明名为" redisCustomConversions"的CustomConversions bean。在您的应用程序配置中。
@Bean
public CustomConversions redisCustomConversions(){
return new CustomConversions(Arrays.asList(new YourWritingConverter(), new YourReadingConverter()));
}
答案 1 :(得分:2)
已通过 spring-boot-starter-data-redis:2.0.4.RELEASE 进行了测试。
我遇到一个问题,在使用OffsetDateTime
时,我的@RedisHash
实体的CrudRepository
属性没有存储。
问题是Jsr310Converters
没有OffsetDateTime
的转换器。
为了解决这个问题,我创建了一个阅读转换器:
@Component
@ReadingConverter
public class BytesToOffsetDateTimeConverter implements Converter<byte[], OffsetDateTime> {
@Override
public OffsetDateTime convert(final byte[] source) {
return OffsetDateTime.parse(new String(source), DateTimeFormatter.ISO_OFFSET_DATE_TIME);
}
}
并编写转换器:
@Component
@WritingConverter
public class OffsetDateTimeToBytesConverter implements Converter<OffsetDateTime, byte[]> {
@Override
public byte[] convert(final OffsetDateTime source) {
return source.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME).getBytes();
}
}
并在配置中注册了RedisCustomConversions
bean:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.convert.RedisCustomConversions;
import org.springframework.data.redis.repository.configuration.EnableRedisRepositories;
import java.util.Arrays;
@Configuration
@EnableRedisRepositories
public class RedisConfiguration {
@Bean
public RedisCustomConversions redisCustomConversions(OffsetDateTimeToBytesConverter offsetToBytes,
BytesToOffsetDateTimeConverter bytesToOffset) {
return new RedisCustomConversions(Arrays.asList(offsetToBytes, bytesToOffset));
}
}
答案 2 :(得分:0)
这些代码可以帮助任何人。谢谢@Mikhail
X509Certificate cert = (X509Certificate) cf.generateCertificate(input);
使用spring-data-redis-1.8.4.RELEASE进行测试
答案 3 :(得分:0)
尝试以这种方式实现。
import java.sql.Timestamp;
import org.springframework.core.convert.converter.Converter;
import org.springframework.data.convert.ReadingConverter;
import org.springframework.stereotype.Component;
@Component
@ReadingConverter
public class BytesToDateConverter implements Converter<byte[], Timestamp> {
@Override
public Timestamp convert(final byte[] source) {
String value = new String(source);
return new Timestamp(Long.parseLong(value));
}
}
和Bean的抵抗者。
@Bean
public MappingRedisConverter redisConverter(RedisMappingContext mappingContext,
RedisCustomConversions customConversions, ReferenceResolver referenceResolver) {
MappingRedisConverter mappingRedisConverter = new MappingRedisConverter(mappingContext, null, referenceResolver,
customTypeMapper());
mappingRedisConverter.setCustomConversions(redisCustomConversions());
return mappingRedisConverter;
}
@Bean
public RedisTypeMapper customTypeMapper() {
return new CustomRedisTypeMapper();
}
public RedisCustomConversions redisCustomConversions() {
return new RedisCustomConversions(
Arrays.asList(new OffsetDateTimeToBytesConverter(), new BytesToOffsetDateTimeConverter(),new BytesToDateConverter()));
}
class CustomRedisTypeMapper extends DefaultRedisTypeMapper {
}