使用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命令本身进行强制转换的对象?
答案 0 :(得分:1)
Class.cast
和ObjectMapper.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
仅尝试将引用类型更改为同一对象。
另请参阅: