Redis - 如何配置自定义转换

时间:2017-03-20 23:05:48

标签: java redis spring-data distributed-caching spring-data-redis

在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

有谁知道怎么做?

4 个答案:

答案 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 {

    }