(以下问题已在fastjson高版本优化<目前我用的是1.2.83版本>)
在一次接手项目中发现,http接口返回json数据,Date类型的变量用@JSONField format注解格式化不起作用。排查原因:
1)查http接口序列化是不是用的fastjson。如果用的是jackson序列化应该使用@JsonFormat注解。
2)找到fastjson配置入口,查看有没有设置统一的DateFormat配置
如果配置类设置了统一的DateFormat,则@JSONField format注解会失效,以统一配置为准。如果没有配置统一的DateFormat,@JSONField format 则有效。
为什么呢?按理说局部配置的优先级应该要大于统一配置的优先级才对。找到对应fastjosn的源码,如下
(1.2.62版本)com.alibaba.fastjson.serializer.JSONSerializer#writeWithFormat
DateFormat dateFormat = this.getDateFormat();//默认配置
if (dateFormat == null) {//重点:只有在没有默认配置下@JSONFiled注解才会生效
try {
dateFormat = new SimpleDateFormat(format, locale);//@JSONFiled的配置
} catch (IllegalArgumentException e) {
String format2 = format.replaceAll("T", "'T'");
dateFormat = new SimpleDateFormat(format2, locale);
}
dateFormat.setTimeZone(timeZone);
}
String text = dateFormat.format((Date) object);
out.writeString(text);
return;
发现代码中统一配置的dateFormat的优先级就是更高。(感觉逻辑不太合理 QAQ)
能不能让@JSONField format优先级更高?当然是可以。简单的办法就是复制个相同路径JSONSerializer类,把上面这段代码改成
DateFormat dateFormat = this.getDateFormat();
if (format != null && format.length() != 0) {
try {
dateFormat = new SimpleDateFormat(format, locale);
} catch (IllegalArgumentException e) {
String format2 = format.replaceAll("T", "'T'");
dateFormat = new SimpleDateFormat(format2, locale);
}
dateFormat.setTimeZone(timeZone);
}
String text = dateFormat.format((Date) object);
out.writeString(text);
return;
重新编译、打包。搞定!