问题形容

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);    }}