中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

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

定安县| 隆林| 枣强县| 梁山县| 阿城市| 梅河口市| 凤山县| 三门县| 资讯| 外汇| 镇江市| 墨竹工卡县| 龙川县| 桃园县| 华容县| 安多县| 日土县| 定兴县| 启东市| 滕州市| 香格里拉县| 汉沽区| 达拉特旗| 莱州市| 海盐县| 聊城市| 顺昌县| 闽清县| 满洲里市| 娄烦县| 重庆市| 安徽省| 阿克苏市| 河源市| 崇明县| 西吉县| 红安县| 黑龙江省| 广汉市| 伽师县| 赤峰市|