亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

fastjson全局日期序列化設置導致JSONField失效如何解決

發布時間:2023-01-03 10:08:53 來源:億速云 閱讀:131 作者:iii 欄目:開發技術

本篇內容主要講解“fastjson全局日期序列化設置導致JSONField失效如何解決”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“fastjson全局日期序列化設置導致JSONField失效如何解決”吧!

問題描述

fastjson通過代碼指定全局序列化返回時間格式,導致使用JSONField注解標注屬性的特殊日期返回格式失效

使用版本

應用名稱版本
springboot2.0.0.RELEASE
fastjson1.2.83

全局設置代碼

public class WebConfig implements WebMvcConfigurer {
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        //1.需要定義一個convert轉換消息的對象;
        FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();
        //2.添加fastJson的配置信息,比如:是否要格式化返回的json數據;
        FastJsonConfig fastJsonConfig = new FastJsonConfig();
        //全局指定了日期格式
        fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");
        //3處理中文亂碼問題
        List<MediaType> fastMediaTypes = new ArrayList<>();
        fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
        //4.在convert中添加配置信息.
        fastJsonHttpMessageConverter.setSupportedMediaTypes(fastMediaTypes);
        fastJsonHttpMessageConverter.setFastJsonConfig(fastJsonConfig);
        //5.將convert添加到converters當中.
        converters.add(fastJsonHttpMessageConverter);
    }
}

屬性設置代碼

    @JSONField(format = "yyyy-MM-dd")
    private Date addDate;

返回結果

請求接口后addDate字段返回的格式為2022-12-17 13:26:45,仍然為全局日期格式,并不設置JSONField后期望的2022-12-17格式

解決方案

統一掃描

系統啟動時掃描對應基類的子類,通過反射獲取標注了JSONField注解的字段并獲取對應的format值

public class FastJsonUtil {
    private static HashMap<String, String> dateMap = new HashMap();
    public static void scanDate2Json(Class runtimeClass, List<String> extraPackageNameList) {
        List<Class> filterClassList = new ArrayList<>();
        filterClassList.add(BaseSystemObject.class);
        List<Class<?>> scanClassList = new ArrayList<>();
        if (!runtimeClass.getPackage().getName().equals(Application.class.getPackage().getName())) {
            scanClassList.addAll(ScanUtil.getAllClassByPackageName(runtimeClass.getPackage(), filterClassList));
        }
        for (String packageName : extraPackageNameList) {
            scanClassList.addAll(ScanUtil.getAllClassByPackageName(packageName, filterClassList));
        }
        for (Class clazz : scanClassList) {
            List<Field> fs = Arrays.asList(clazz.getDeclaredFields());
            for (Field field : fs) {
                field.setAccessible(true);
                if (field.getType() == Date.class) {
                    JSONField jsonField = field.getAnnotation(JSONField.class);
                    if (jsonField != null && !StringUtil.isEmpty(jsonField.format())) {
                        dateMap.put(clazz.getName() + "|" + field.getName(), jsonField.format());
                    }
                }
            }
        }
    }
    public static boolean checkDate2Json(String key){
        return dateMap.containsKey(key);
    }
    public static String getDate2JsonFormat(String key){
        return dateMap.get(key);
    }
}

統一修改

實現fastjson的擴展過濾器ValueFilter進行序列化后的值修改,并注冊到配置中去

public class FastJsonPropertyValueFilter implements ValueFilter {
    @Override
    public Object process(Object source, String name, Object value) {
        String key = source.getClass().getName() + "|" + name;
        if (value != null && FastJsonUtil.checkDate2Json(key)) {
            String format = FastJsonUtil.getDate2JsonFormat(key);
            DateFormat df = new SimpleDateFormat(format);
            return df.format(value);
        }
        return value;
    }
}
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        //1.需要定義一個convert轉換消息的對象;
        FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();
        //2.添加fastJson的配置信息,比如:是否要格式化返回的json數據;
        FastJsonConfig fastJsonConfig = new FastJsonConfig();
        //全局指定了日期格式
        fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");
        //指定json返回規則
        fastJsonConfig.setSerializeFilters(new FastJsonPropertyValueFilter());
        //3處理中文亂碼問題
        List<MediaType> fastMediaTypes = new ArrayList<>();
        fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
        //4.在convert中添加配置信息.
        fastJsonHttpMessageConverter.setSupportedMediaTypes(fastMediaTypes);
        fastJsonHttpMessageConverter.setFastJsonConfig(fastJsonConfig);
        //5.將convert添加到converters當中.
        converters.add(fastJsonHttpMessageConverter);
    }
}

到此,相信大家對“fastjson全局日期序列化設置導致JSONField失效如何解決”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

临洮县| 隆昌县| 漠河县| 宝鸡市| 崇文区| 手机| 高雄市| 芷江| 汉寿县| 光泽县| 娱乐| 中方县| 扎鲁特旗| 贡嘎县| 高邮市| 龙里县| 大连市| 郸城县| 扎囊县| 中西区| 奈曼旗| 濉溪县| 西平县| 富顺县| 宜良县| 会东县| 永川市| 张掖市| 岗巴县| 城口县| 宁陵县| 高安市| 呼玛县| 乌拉特前旗| 丽江市| 永顺县| 亳州市| 沿河| 渭南市| 南召县| 肃南|