一、問題描述
項目追加Redis緩存後,報錯autotype is not support錯誤。根據網上資料解決後,報Json解析錯誤,後檢視Redis資料庫中該資料格式發現,存入的是枚舉名稱(即字元串),而接收的是對象類型,故報錯
二、查找并解決
1.檢視日志,報autoType is not support錯誤,上百度!--->
FastJson解析失敗,autotype is not support!這是部落客給出的原因。
2017年3月15日,fastjson官方釋出安全更新公告,該公告介紹fastjson在1.2.24及之前的版本存在代碼執行漏洞,當惡意攻擊者送出一個精心構造的序列化資料到服務端時,由于fastjson在反序列化時存在漏洞,可導緻遠端任意代碼執行。
自1.2.25及之後的版本,禁用了部分autotype的功能,也就是”@type”這種指定類型的功能會被限制在一定範圍内使用。
而由于反序列化對象時,需要檢查是否開啟了autotype。是以如果反序列化檢查時,autotype沒有開啟,就會報錯
既然找到了原因,安排!
@Configuration
public class RedisConfig {
RedisConfig(){
//打開autotype功能
ParserConfig.getGlobalInstance()
//需要開啟autotype的全類名
.addAccept("com.entity.dto.UserDTO");
}
}
然後接收報錯,
,不過這次是json格式錯誤導緻解析失敗。
百思不得其解,為啥存入時序列化沒問題,取出反序列化就報錯?
難道是姿勢不對?
換個坐姿,還是不行。
咋整?
直接看Redis資料庫資料!
果不其然,Java中Metric是個對象,但是資料庫中确實字元串!
為何出現這種情況呢?是因為,在給Metric指派的時候,采取了枚舉類,此時序列化會序列化為字元串,而不是對象類型!!!
如何解決?
自定義Metric對象,而不是采用枚舉類!
import org.springframework.data.geo.Metric;
/**
* @Description : 自定義Metric 類
*/
public class KilometersMetric implements Metric {
public KilometersMetric(){
}
@Override
public double getMultiplier() {
return 6378.137D;
}
@Override
public String getAbbreviation() {
return "km";
}
}
此時再看Redis中資料格式,已經為對象形式,就沒有了序列化問題了。
完結,撒花,又是
的一天。