Spring Boot Data Redis - 序列化为 json -> 类 java.util.LinkedHashMap 无法转换

问题描述

我将 Spring Boot 2.4.2

一起使用
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

在我的应用中,我有

package com.tuto.app1;
import lombok.Data;
@Data
public class Student {
    private String firstName;
    private String lastName;
    private int age;
}

还有

@Bean
public CacheManager redisCacheManager() {
    RedisSerializationContext.SerializationPair<Object> jsonSerializer =
            RedisSerializationContext.SerializationPair.fromSerializer(new new Jackson2JsonRedisSerializer<>(Object.class));
    return RedisCacheManager.RedisCacheManagerBuilder
            .fromConnectionFactory(redisConnectionFactory())
            .cacheDefaults(
                    RedisCacheConfiguration.defaultCacheConfig()
                            .entryTtl(Duration.ofDays(1))
                            .serializeValuesWith(jsonSerializer)
            )
            .build();
}

@GetMapping("/students/{name}")
@Cacheable(value = "student")
public Student getStudent(@PathVariable String name) {
    Student student = new Student();
    student.setFirstName("John");
    student.setLastName(name);
    student.setAge(30);
    return student;
}

第一次调用 http://.../app1/students/toto 返回

{
"firstName": "John","lastName": "toto","age": 30
}

在缓存中我有

{"firstName":"John","lastName":"toto","age":30}

好的,这就是我想要的。

但是......所有其他对http://.../app1/students/toto的呼叫都在给我

class java.util.LinkedHashMap cannot be cast to class com.tuto.app1.Student (java.util.LinkedHashMap is in module java.base of loader 'bootstrap'; com.tuto.app1.Student is in unnamed module of loader org.springframework.boot.devtools.restart.classloader.RestartClassLoader @32bd421)
java.lang.classCastException: class java.util.LinkedHashMap cannot be cast to class com.tuto.app1.Student (java.util.LinkedHashMap is in module java.base of loader 'bootstrap'; com.tuto.app1.Student is in unnamed module of loader org.springframework.boot.devtools.restart.classloader.RestartClassLoader @32bd421)

解决方案是什么?

解决方法

你可以为redis设置json字符串数据。 例如:

redistemplate.opsxxx.set("key",JSON.toJsonString(new JavaBean()));
String json = redistemplate.opsxxx.get("key");
//convert
JSON.parseObject(json,JavaBean.class);