存入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; //资源id
private 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; //资源id
private 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的ParserConfig
ParserConfig 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;
}