Redis данных Redis возвращает ноль при десериализации типа списка - PullRequest
0 голосов
/ 03 сентября 2018

Я использую данные Redis Redis, и у одного из моих лиц есть список, как показано ниже.

@RedisHash("person")
@Data
@Builder
public class Person implements Serializable {

    @Id
    private String name;
    private List<Address> addressList;

}

public class Address implements Serializable {

    private String postCode;
    private String country;

}

Сериализация работает нормально, а адрес сохраняется как

 HGETALL person:123456
 "name"
 "blabla"
 "address[0].postCode"
 "1111XX"
 "address[1].country"
 "IN"

но при возвращении человека список всегда будет нулевым? кто-то может указать, что я делаю здесь неправильно.

Моя конфигурация Redis выглядит следующим образом.

@Configuration
@EnableRedisRepositories
public class RedisConfiguration {

    @Bean
    public JedisConnectionFactory jedisConnectionFactory() {
        return new JedisConnectionFactory();
    }

    @Bean
    public RedisTemplate<String, String> redisTemplate() {
        final RedisTemplate<String, String> template = new RedisTemplate<>();
        RedisSerializer<String> redisSerializer = new StringRedisSerializer();
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);

        ObjectMapper mapper = new ObjectMapper();
        mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        mapper.findAndRegisterModules();

        template.setKeySerializer(redisSerializer);
        template.setValueSerializer(jackson2JsonRedisSerializer);
        template.setHashValueSerializer(jackson2JsonRedisSerializer);
        template.setConnectionFactory(jedisConnectionFactory());
        return template;
    }
}

1 Ответ

0 голосов
/ 21 сентября 2018

У меня есть некоторые подозрения, но не могли бы вы поделиться чуть большим фрагментом кода о том, как вы используете redisTemplate для сохранения данных в redis?

Но, скорее всего, это потому, что вы настроили инициализацию как ключа, так и значения в RedisTemplate

RedisTemplate<K, V> как <String, String>

Именно поэтому даже с Jackson2JsonSerializer он не может сериализовать и десериализовать класс List<Address> должным образом.

Возможное решение будет:

@Bean
    public RedisTemplate<String, Person> redisTemplate(JedisConnectionFactory jedisConnectionFactory) {
        RedisTemplate<String, Person> redisTemplate = new RedisTemplate<>();

        redisTemplate.setConnectionFactory(jedisConnectionFactory);
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());

        return redisTemplate;
    }

А затем вы сохраняете весь объект Person в Redis

Когда вам это нужно, вы извлекаете весь объект и реализуете свой метод получения и установки.

Надеюсь, это поможет

...