1. 程式人生 > >FastJsonHttpMessageConverter設定dateFormat後導致JSONField註解format失效解決辦法

FastJsonHttpMessageConverter設定dateFormat後導致JSONField註解format失效解決辦法

springmvc使用fastjson作為json的解析器,由於系統大部分時間格式都是yyyy-MM-dd,所以想修改fastjson的預設日期格式化pattern。網上搜到的都是重寫FastJsonHttpMessageConverter writeInternal方法,在其中加入SerializeConfig引數加入date型別自定義的ObjectSerializer(fastjson 1.2.9之後本身已實現,無需重寫了)。
按此辦法修改後輸出的格式都變成yyyy-MM-dd了,不過有些地方我想要yyyy-MM-dd HH:mm格式,在obj的屬性上加了@JSONField(format=”yyyy-MM-dd HH:mm”)註解後竟然不起作用了。。。
看了下原始碼,大概原因如下:

public class JSONSerializer extends SerializeFilterable {
...
public final void writeWithFormat(Object object, String format) {//@JSONField註解的format以引數形式傳進來
        if (object instanceof Date) {
            DateFormat dateFormat = this.getDateFormat();
            if (dateFormat == null) { //但是由於FastJsonHttpMessageConverter設定的dateFormat會使得此處的format不為空,所以該條件永遠不會滿足從而導致@JSONField註解失效
dateFormat = new SimpleDateFormat(format, locale); dateFormat.setTimeZone(timeZone); } String text = dateFormat.format((Date) object); out.writeString(text); return; } write(object); } ... }

應該是fastjson自身的bug,不應該用通用配置去覆蓋個性化,而應該是反過來的。
解決方法很簡單,只要在系統啟動的時候加下面這句JSON.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd";

這樣日期預設轉換格式就改掉了,JSONField註解依然有效。