使用class.cast转换从Redis接收的对象失败,并使用ObjectMapper.convertValue进行工作

时间:2019-03-08 12:21:19

标签: java json spring-boot jackson

使用Class.cast使用ObjectMapper.convertValue将对象转换为特定类型v / s的区别是什么? 我假设强制转换在内部也使用jackson,但我认为情况并非如此。

我的RedisTemplateConfig:

@Bean
public ReactiveRedisTemplate<String, Object> reactiveRedisTemplate(
    ReactiveRedisConnectionFactory factory) {
    StringRedisSerializer keySerializer = new StringRedisSerializer();
    Jackson2JsonRedisSerializer<Object> valueSerializer =
        new Jackson2JsonRedisSerializer<>(Object.class);
    RedisSerializationContext.RedisSerializationContextBuilder<String, Object> builder =
        RedisSerializationContext.newSerializationContext(keySerializer);
    RedisSerializationContext<String, Object> context =
        builder.value(valueSerializer).build();

    return new ReactiveRedisTemplate<>(factory, context);
}

SetValueInRedis:

@Override
public <T> Mono<T> setValue(String key, Object value, Class<T> clazz) {
    return reactiveValueOps.set(key, value,
            Duration.ofDays(SESSION_PERSISTENCE_DURATION))
            .map(o -> clazz.cast(value));
}

正在使用GetValueInRedis:

@Override
public <T> Mono<T> getValue(String key, Class<T> clazz) {
        return reactiveValueOps.get(key)
            .flatMap(val -> Mono.justOrEmpty(objectMapper.convertValue(val, clazz)));
}

获取价值的错误版本:

@Override
public <T> Mono<T> getValue(String key, Class<T> clazz) {
    return reactiveValueOps.get(key)
        .flatMap(o -> Mono.justOrEmpty(clazz.cast(o)));
    }

----编辑----

如果我们注意到用于Redis(Jackson2JsonRedisSerializer)的序列化器:在将对象保存为Redis的同时,它可以正常工作。但是,当读取(获取)cast失败并且objectMappper可以工作时。当我使用Jackson2JsonRedis序列化程序时,get命令是否不应该返回可以使用Class.cast命令本身进行强制转换的对象?

1 个答案:

答案 0 :(得分:1)

Class.castObjectMapper.convertValue是两种完全不同的机制。 Class.cast不会创建新对象,只会返回具有新类型的旧引用。在下面,您可以看到如何实现Class.cast

public T cast(Object obj) {
    if (obj != null && !isInstance(obj))
        throw new ClassCastException(cannotCastMsg(obj));
    return (T) obj;
}
另一面的

Jackson从不同的层次结构创建新对象并复制内部结构。例如,可以使用反射将Map转换为POJO,将POJO转换为Map。但是您不能在引用Map时引用POJO

摘要:这两个中只有convertValue个方法确实可以将一个实例转换为新实例,以及将一种类型转换为新实例。 cast仅尝试将引用类型更改为同一对象。

另请参阅: