2

I want to store my WebSession in Redis. There is no problem at put operation, but it throws exception when retrieving stored record. Here is my example stack trace

Caused by: com.fasterxml.jackson.databind.exc.MismatchedInputException: Unexpected token (START_OBJECT), expected START_ARRAY: need JSON Array to contain As.WRAPPER_ARRAY type information for class java.lang.Object at [Source: (byte[])"{"attributes":["org.springframework.session.web.server.session.SpringSessionWebSessionStore$SpringSessionMap",{}],"id":"2a5c3d9b-3557-4bd6-bca8-9e221c3a5b41","lastAccessTime":{"nano":800305900,"epochSecond":1605268779},"creationTime":{"nano":800305900,"epochSecond":1605268779},"expired":false,"maxIdleTime":{"seconds":5400,"nano":0,"negative":false,"zero":false,"units":["java.util.ImmutableCollections$List12",[["java.time.temporal.ChronoUnit","SECONDS"],["java.time.temporal.ChronoUnit","NANOS"]]]"[truncated 18 bytes]; line: 1, column: 1]

How could I solve this problem? I don't understand why it is happening? Thanks.

Here is my session service.

@Component
@RequiredArgsConstructor
@Slf4j
public class SessionMappingStorage {

    private static final String USR_TO_SESSION___KEY = "USR_SESSION_MAP";

    private final ReactiveHashOperations<String, String, Object> hashOps;

    public Mono<Boolean> addSession(String username, WebSession session) {
       return hashOps.put(USR_TO_SESSION___KEY, username, session);
    }

    public Mono<WebSession> getSessionByUserId(String username) {
       return hashOps.get(USR_TO_SESSION___KEY, username).cast(WebSession.class);  
    }
}

Here is my redis configuration.

@Bean
public ReactiveRedisTemplate<String, String> reactiveRedisTemplate() {
    RedisSerializer keySerializer, hashKeySerializer, hashValueSerializer;
    keySerializer = hashKeySerializer = new StringRedisSerializer();
    hashValueSerializer = new GenericJackson2JsonRedisSerializer(objectMapper());

    RedisSerializationContext.RedisSerializationContextBuilder<String, String> builder =
            RedisSerializationContext.newSerializationContext(keySerializer);
    RedisSerializationContext<String, String> context =
            builder.hashKey(hashKeySerializer).hashValue(hashValueSerializer).build();

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

@Bean
public ReactiveHashOperations<String, String, Object> hashOps() {
    return reactiveRedisTemplate().opsForHash();
}

private ObjectMapper objectMapper() {
    ObjectMapper mapper = new ObjectMapper();
    mapper.enableDefaultTyping();
    return mapper;
}
denizg
  • 828
  • 9
  • 18
  • I think you are getting an array of WebSession rather than just objects. Could you include full code? how are you injecting hashOps? May be give a try to cast list of WebSession objects rather than WebSession.class? – Lokesh Nov 22 '20 at 07:24
  • @Lokesh thnx for response. i updated my session service. and i have tried to casting list instead of websession object. but same error happened. – denizg Nov 26 '20 at 08:50

0 Answers0