存入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;
}