Redis - Как настроить пользовательские преобразования

В spring-data-redis, Как нам нужно настроить собственные конвертеры, которые могут быть автоматически подключены / внедрены из загрузочного приложения или конфигурации Spring.

Я прочитал о @ReadingConverter и @WritingConverter из документации по перерисовке данных Spring. Из этой документации не ясно, как их настроить. https://github.com/spring-projects/spring-data-redis/blob/master/src/main/asciidoc/reference/redis-repositories.adoc#redis.repositories.indexes

кто нибудь знает как это сделать?

3 ответа

Протестировано с помощью 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 Боб в конфигурации:

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

}

Вы должны объявить bean-компонент CustomConversions с именем "redisCustomConversions" в конфигурации вашего приложения.

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

Этот код может помочь любому. Спасибо @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

Попробуй реализовать так.

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

    }
Другие вопросы по тегам