若依使用RedisCache需要注意的事项
存入redis对象的时候会带一个@type字段,此处需要注意
存入方:
此处需要注意,存入redis的时候会带一个@type,也就是类的路径名
redisCache.setCacheObject(screenPlayQueueName, userDemondDto,userDemondDto.getPlayDuration().intValue(), TimeUnit.SECONDS);package com.pmkz.core.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.Date;
/*** @version 1.0* @description* @date 2025/5/26 16:57*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserOnDemandDto {private Long reId; //资源idprivate String isLoopPlay; //是否循环播放private Long timestamp;private Long userId;private String contentType;private Long playDuration; //持续时间为s@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")private Date displayTime; //开始时间@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")private Date displayEndTime; //结束时间private double longitude; //经度private double latitude; //纬度private Long logId;//日志id
}
取出方
此处可以看出取出方的类的路径名与存入redis的不一致,就会出现类型转换的错误
UserOnDemandDto userOnDemandDtoCache = redisCache.getCacheObject(screenPlayQueueName);package com.lxsq.service.dto;import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;import java.math.BigDecimal;
import java.util.Date;/*** @author 陈丹阳* @version 1.0* @description* @date 2025/6/9 8:57*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class UserOnDemandDto {private Long reId; //资源idprivate String isLoopPlay; //是否循环播放private Long timestamp;private Long userId;private String contentType;private Long playDuration; //持续时间为s@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")private Date displayTime; //开始时间@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")private Date displayEndTime; //结束时间private double longitude; //经度private double latitude; //纬度private Long logId;//日志id
}
临时解决方法
Object result = redisCache.getCacheObject(screenPlayQueueName);if (result instanceof String) {String jsonStr = (String) result;// 移除@type信息jsonStr = jsonStr.replaceAll("\"@type\":\"[^\"]+\",?", "");jsonStr = jsonStr.replaceAll(",}", "}").replaceAll(",]", "]");// 转换为目标对象userOnDemandDtoCache = JSON.parseObject(jsonStr, UserOnDemandDto.class);}
永久解决办法(在RedisConfig中进行配置)
@SuppressWarnings(value = { "unchecked", "rawtypes" })
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {RedisTemplate<Object, Object> template = new RedisTemplate<>();template.setConnectionFactory(connectionFactory);// 配置FastJson的ParserConfigParserConfig parserConfig = new ParserConfig();parserConfig.setAutoTypeSupport(true); // 开启自动类型支持parserConfig.addAccept("com.yourpackage."); // 添加允许的包名前缀FastJson2JsonRedisSerializer serializer = new FastJson2JsonRedisSerializer(Object.class);serializer.setFastJsonConfig(new FastJsonConfig());serializer.getFastJsonConfig().setParserConfig(parserConfig);template.setKeySerializer(new StringRedisSerializer());template.setValueSerializer(serializer);template.setHashKeySerializer(new StringRedisSerializer());template.setHashValueSerializer(serializer);template.afterPropertiesSet();return template;
}