Redis data pegas mengembalikan null pada deserialisasi tipe Daftar

Saya menggunakan redis data pegas dan salah satu entitas saya memiliki daftar seperti di bawah ini.

@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;

}

Serialisasi berfungsi dengan baik dan alamatnya disimpan sebagai

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

tetapi ketika mengembalikan orang itu, Daftarnya selalu nol? dapatkah seseorang menunjukkan kesalahan saya di sini.

Konfigurasi Redis saya terlihat seperti di bawah ini.

@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 sumber
comment
Saya juga punya masalah yang sama, bagaimana cara mengatasinya?   -  person Lucas Araújo    schedule 10.01.2019


Jawaban (1)


Saya memiliki beberapa kecurigaan tetapi bisakah Anda membagikan lebih banyak cuplikan kode tentang cara Anda menggunakan redisTemplate untuk menyimpan data ke redis?

Namun kemungkinan besar itu karena Anda menyiapkan inisialisasi Kunci dan Nilai dari RedisTemplate

RedisTemplate<K, V> as <String, String>

Itulah sebabnya bahkan dengan Jackson2JsonSerializer ia tidak dapat membuat serialisasi dan deserialisasi kelas List<Address> dengan benar.

Solusi yang mungkin adalah:

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

Dan kemudian Anda menyimpan seluruh objek Person ke dalam Redis

Saat Anda membutuhkannya maka Anda mengeluarkan seluruh objek dan mengimplementasikan pengambil dan penyetel Anda.

Semoga ini membantu

person JWiryo    schedule 21.09.2018