Cacheable序列化乱码

232 阅读1分钟

场景

原本希望序列化为json格式的数据在redis中乱码

返回前端数据

image.png

redis 存储格式

image.png

缓存方法

@GetMapping("/getPage")  
@Cacheable(value="areaPage",key="'areaPage_'+#page+'_'+#size")  
public ResponseResult getPage(@RequestParam("page") int page, @RequestParam("size") int size) {  
    PageRequestDto pageDTO = new PageRequestDto();  
    pageDTO.setPage(page);  
    pageDTO.setSize(size);  
    return areaService.getPage(pageDTO);  
}

解决策略

添加config

import org.springframework.boot.autoconfigure.cache.CacheProperties;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;

/**
 * <p>RedisConfig 此类用于:Redis相关配置,用于解决存入Redis中值乱码问题 </p>
 */
@EnableCaching
@Configuration
public class RedisConfig extends CachingConfigurerSupport {

    @Bean
    public RedisCacheConfiguration redisCacheConfiguration(CacheProperties cacheProperties) {

        CacheProperties.Redis redisProperties = cacheProperties.getRedis();
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig();

        // 序列化值
        config = config.serializeValuesWith(RedisSerializationContext.SerializationPair
                .fromSerializer(new GenericJackson2JsonRedisSerializer()));

        if (redisProperties.getTimeToLive() != null) {
            config = config.entryTtl(redisProperties.getTimeToLive());
        }
        if (redisProperties.getKeyPrefix() != null) {
            config = config.prefixKeysWith(redisProperties.getKeyPrefix());
        }
        if (!redisProperties.isCacheNullValues()) {
            config = config.disableCachingNullValues();
        }
        if (!redisProperties.isUseKeyPrefix()) {
            config = config.disableKeyPrefix();
        }

        return config;
    }
}

展示

此时如下方法缓存成功且展示效果正常

@Autowired  
private CityService cityService;  
@GetMapping("/getAll")  
@Cacheable(value="cityList",key="'cityList'",sync = true)  
    public ResponseResult getAll(){  
    return cityService.getAll();  
}

image.png

但是分页方法还是展示失败,说是JSON序列化器不支持localdatetime格式的时间

image.png

image.png 添加依赖

 <dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
    <version>2.14.2</version>
</dependency>

实体类的时间属性添加注解

@JsonDeserialize(using = LocalDateTimeDeserializer.class)  
@JsonSerialize(using = LocalDateTimeSerializer.class)

image.png