fastjson全局日期序列化設置導致JSONField失效問題解決方案
問題描述
fastjson通過代碼指定全局序列化返回時間格式,導致使用JSONField註解標註屬性的特殊日期返回格式失效
使用版本
應用名稱 | 版本 |
---|---|
springboot | 2.0.0.RELEASE |
fastjson | 1.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失效問題解決方案的文章就介紹到這瞭,更多相關fastjson日期序列化內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- springboot中使用FastJson解決long類型在js中失去精度的問題
- fastjson轉換對象實體@JsonProperty不生效問題及解決
- 解決SpringBoot返回結果如果為null或空值不顯示處理問題
- SpringBoot2.0解決Long型數據轉換成json格式時丟失精度問題
- 淺談Java中FastJson的使用