kotlin jackson missing type id property '@class'

使用kotlin 搭配redis 存储json格式数据的问题

Redis 配置如下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
   @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();

        redisTemplate.setConnectionFactory(redisConnectionFactory);

        // json 序列化
        redisTemplate.setValueSerializer(RedisSerializer.json());

        RedisSerializer<String> stringRedisSerializer = RedisSerializer.string();

        // 使用StringRedisSerializer来序列化和反序列化redis的key值
        redisTemplate.setKeySerializer(stringRedisSerializer);

        // hash的key也采用String的序列化方式
        redisTemplate.setHashKeySerializer(stringRedisSerializer);
        // hash的value序列化方式采用jackson
        redisTemplate.setHashValueSerializer(RedisSerializer.json());

        return redisTemplate;
    }

在使用redistemplate 时,我们使用json格式默认存储value,然后发现每次存进去的数据都会少@class 在取出数据反序列化的时候会报错

GenericJackson2JsonRedisSerializer 文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
    public GenericJackson2JsonRedisSerializer(@Nullable String classPropertyTypeName) {
        this(new ObjectMapper());
        registerNullValueSerializer(this.mapper, classPropertyTypeName);
        if (StringUtils.hasText(classPropertyTypeName)) {
            this.mapper.enableDefaultTypingAsProperty(DefaultTyping.NON_FINAL, classPropertyTypeName);
        } else {
            this.mapper.enableDefaultTyping(DefaultTyping.NON_FINAL, As.PROPERTY);
        }

    }

查看源码,发现在这个jackson的配置中,默认使用了DefaultTyping.NON_FINAL 而在 kotlin中 我们的类 默认是final的 需要添加在类前面添加open修饰符

或者你也可以使用使用自定义objectMapper 并设置 ObjectMapper.DefaultTyping.EVERYTHING

Built with Hugo
主题 StackJimmy 设计