场景
原本希望序列化为json格式的数据在redis中乱码
返回前端数据
redis 存储格式
缓存方法
@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();
}
二
但是分页方法还是展示失败,说是JSON序列化器不支持localdatetime格式的时间
添加依赖
<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)