Spring data redis возвращает null при десериализации типа списка

Я использую Spring Data 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;
    }
}

person sash    schedule 03.09.2018    source источник
comment
У меня такая же проблема, как вы это решаете?   -  person Lucas Araújo    schedule 10.01.2019


Ответы (1)


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

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

RedisTemplate<K, V> as <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

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

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

person JWiryo    schedule 21.09.2018