Whats the difference between using Class.cast
to convert an object to a certain type v/s doing the same using ObjectMapper.convertValue
.
I am assuming cast also internally uses jackson
but I think that's not the case here.
My 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));
}
Working GetValueInRedis:
@Override
public <T> Mono<T> getValue(String key, Class<T> clazz) {
return reactiveValueOps.get(key)
.flatMap(val -> Mono.justOrEmpty(objectMapper.convertValue(val, clazz)));
}
Error version of Get Value:
@Override
public <T> Mono<T> getValue(String key, Class<T> clazz) {
return reactiveValueOps.get(key)
.flatMap(o -> Mono.justOrEmpty(clazz.cast(o)));
}
----EDIT----
If we notice the serializer used for Redis(Jackson2JsonRedisSerializer
): while saving the object to redis it works fine. But while reading(get) cast
fails and objectMappper
works. When I am using Jackson2JsonRedis
serializer, shouldn't get
command return an object which should be castable using Class.cast command itself?