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

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

เมื่อคุณต้องการมัน คุณจะต้องนำอ็อบเจ็กต์ทั้งหมดออกมาและใช้งาน getter และ setter ของคุณ

หวังว่านี่จะช่วยได้

person JWiryo    schedule 21.09.2018