天天看點

記錄下擷取Redis的GEO類型資料後,使用FastJson解析報錯問題

一、問題描述

項目追加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沒有開啟,就會報錯

記錄下擷取Redis的GEO類型資料後,使用FastJson解析報錯問題

    既然找到了原因,安排!

@Configuration
public class RedisConfig {
 
    RedisConfig(){
        //打開autotype功能
        ParserConfig.getGlobalInstance()
                //需要開啟autotype的全類名
            .addAccept("com.entity.dto.UserDTO");
    }
}      

然後接收報錯,

記錄下擷取Redis的GEO類型資料後,使用FastJson解析報錯問題

,不過這次是json格式錯誤導緻解析失敗。

百思不得其解,為啥存入時序列化沒問題,取出反序列化就報錯?

難道是姿勢不對?

換個坐姿,還是不行。

咋整?

直接看Redis資料庫資料!

果不其然,Java中Metric是個對象,但是資料庫中确實字元串!

記錄下擷取Redis的GEO類型資料後,使用FastJson解析報錯問題

為何出現這種情況呢?是因為,在給Metric指派的時候,采取了枚舉類,此時序列化會序列化為字元串,而不是對象類型!!!

記錄下擷取Redis的GEO類型資料後,使用FastJson解析報錯問題

如何解決?

自定義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中資料格式,已經為對象形式,就沒有了序列化問題了。

記錄下擷取Redis的GEO類型資料後,使用FastJson解析報錯問題

完結,撒花,又是

記錄下擷取Redis的GEO類型資料後,使用FastJson解析報錯問題

的一天。