【问题标题】:Spring boot can not read data from redis cache serializer.SerializationException: Cannot deserializeSpring boot 无法从 redis 缓存序列化程序中读取数据。SerializationException:无法反序列化
【发布时间】:2021-12-14 02:37:35
【问题描述】:

我正在尝试制作从 redis 缓存中读取数据的 Spring Boot 应用程序。但我不能。

首先我调用 post api 来创建用户,然后我调用 get api 到 getUserById 但我收到这样的错误:

java.lang.ClassNotFoundException: com.umut.redis.redisExample.Model.UserEntity 在 java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581) ~[na:na] 在 java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) ~[na:na] 在 java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) ~[na:na] at java.base/java.lang.Class.forName0(Native Method) ~[na:na] 在 java.base/java.lang.Class.forName(Class.java:398) ~[na:na] 在 org.springframework.boot.devtools.restart.classloader.RestartClassLoader.loadClass(RestartClassLoader.java:145) ~[spring-boot-devtools-2.5.6.jar:2.5.6] 在 java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) ~[na:na] at java.base/java.lang.Class.forName0(Native Method) ~[na:na]

我正在运行 docker 容器到 redis。

@Configuration
@EnableCaching
public class RedisCacheConfiguration {

    @Bean
    JedisConnectionFactory jedisConnectionFactory() {
        JedisConnectionFactory jedisConFactory
                = new JedisConnectionFactory();
        jedisConFactory.setHostName("localhost");
        jedisConFactory.setPort(6379);
        return jedisConFactory;
    }

    @Bean
    public RedisTemplate<String, Object> redisTemplate() {
        RedisTemplate<String, Object> template =new RedisTemplate<>();
        template.setHashValueSerializer(new StringRedisSerializer());
        template.setConnectionFactory(jedisConnectionFactory());
        return template;
    }

}



@Service
public class UserServiceImpl implements IUserService{

    private final UserRepository userRepository;

    public UserServiceImpl(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public UserDto createUser(CreateUserRequest createUserRequest){
         UserEntity userEntity = new UserEntity();
         userEntity.setName(createUserRequest.getName());
         userEntity.setSurname(createUserRequest.getSurname());
         userRepository.save(userEntity);
         return UserMapper.INSTANCE.userEntityToUserDto(userEntity);
    }

    @Cacheable(value= "user", key = "#userId")
    public UserDto getUserById(Long userId){
        System.out.println("getuserbyid içerisi");
        UserEntity userEntity = userRepository.getById(userId);
        return UserMapper.INSTANCE.userEntityToUserDto(userEntity);
    }
}

【问题讨论】:

    标签: java spring spring-boot redis spring-data-redis


    【解决方案1】:

    使用@EnableRedisRepositories 进行注释并且UserEntity 应该实现可序列化。

    @Configuration
    @EnableCaching
    @EnableRedisRepositories
    public class RedisCacheConfiguration {
    
    @Bean
    JedisConnectionFactory jedisConnectionFactory() {
        JedisConnectionFactory jedisConFactory
                = new JedisConnectionFactory();
        jedisConFactory.setHostName("localhost");
        jedisConFactory.setPort(6379);
        return jedisConFactory;
    }
    
    @Bean
    public RedisTemplate<String, Object> redisTemplate() {
        RedisTemplate<String, Object> template =new RedisTemplate<>();
        template.setHashValueSerializer(new StringRedisSerializer());
        template.setConnectionFactory(jedisConnectionFactory());
        return template;
    }
    
    }
    
    @RedisHash("UserEntity")
    public class UserEntity implements Serializable{
    }
    

    【讨论】:

    • UserEntity 已经实现了可序列化。但我正在使用 h2 数据库。我想使用 h2 数据库。当我调用getUserById方法时,首先用户应该来自h2数据库,当我第二次调用这个方法时,用户应该来自redis缓存
    • 当我将值从用户更改为用户时,它正在工作。但我不知道为什么 :) @Cacheable(value = "users", key = "#userId")
    • 在保存用户时,我们在 @CachePut 中放置了一个 value 关键字,我们在获取时使用相同的关键字。详情请通过this
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-24
    • 1970-01-01
    • 1970-01-01
    • 2016-11-26
    • 1970-01-01
    • 2017-02-15
    • 2021-02-08
    相关资源
    最近更新 更多