Redis - 如何配置自定义转换

问题描述 投票:6回答:3

在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

有谁知道怎么做?

java redis spring-data distributed-caching spring-data-redis
3个回答
4
投票

您必须在应用程序配置中声明名为“redisCustomConversions”的CustomConversions bean。

@Bean
public CustomConversions redisCustomConversions(){
    return new CustomConversions(Arrays.asList(new YourWritingConverter(), new YourReadingConverter()));
}

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));
    }

}

0
投票

这些代码可以帮助任何人。谢谢@Mikhail

@Component
public class RedisObjectHelper {

    @Resource
    private RedisTemplate<String, ?> redisTemplate;
    private HashOperations<String, byte[], byte[]> hashOperations;
    private HashMapper<Object, byte[], byte[]> mapper;

    @PostConstruct
    public void init() {
        mapper = new ObjectHashMapper(new CustomConversions(Arrays.asList(new Timestamp2ByteConverter(), new Byte2TimestampConverter())));
        hashOperations = redisTemplate.opsForHash();
    }
    // and any methods
}

用spring-data-redis-1.8.4.RELEASE测试

© www.soinside.com 2019 - 2024. All rights reserved.