lombok註解:@AllArgsConstructor 的一個異常

問題描述:

有以下實體類:

@Data
@ToString
@AllArgsConstructor
public class UpdateTargetInfoBean {

    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
    private Date endDate;

    /**
     * 存到數據庫裏的格式是yyyy-MM-dd
     */
    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
    private Date startDate;
}

這個實體類作爲前端的參數使用,前端傳遞該類的json數據,後端將其反序列爲Bean。請求接口如下:

    /**
     * 修改成員目標信息
     */
    @RequestMapping(value = "update/target", method = RequestMethod.POST, consumes = "application/json",produces = "application/json")
    @ResponseBody
    @ApiOperation("修改成員目標信息")
    public Response updateTarget(@RequestBody UpdateTargetInfoBean updateTargetInfo) throws DataFormatErrorException, DataNotExistException {
        memberTargetService.updateTarget(updateTargetInfo);
        return Response.ok();
    }

當前端傳遞:

"endDate":"2019-08-18 00:00:00","startDate":"2019-08-08 14:35:12"

會報json轉換異常。原因是String類型的"endDate":"2019-08-18 00:00:00"無法轉換爲java.util.Date類型。

傳遞:

"endDate":"2019-08-18","startDate":"2019-08-08"

正常,沒有異常。

當去掉@AllArgsConstructor註解時,傳遞以上兩種形式都沒有異常。

懷疑:

是@AllArgsConstructor註解在反序列化的過程中,強制要求 @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")註解生效,不符合該日期格式的json數據無法發序列化。

解惑:

看源碼,後綴是.lombok的源碼,沒看明白。看class文件也沒發現加@AllArgsConstructor註解後有啥不一樣。網上搜索到一個相關的解釋。Lombok的介紹及實現原理解析(Java插入式註解處理器)

看這篇文章的內容:Lombok利用Java的插入式註解處理器提供的API,讀取、修改、添加抽象語法樹中的任意元素。如果因爲這些註解對語法樹進行了修改,編譯器會重新進行詞法、語法的分析處理,直到所有的插入式註解沒有對語法樹進行修改爲止。

大概是@AllArgsConstructor註解在反序列化的過程中,強制要求 @JsonFormat註解校驗參數吧。這裏先記錄一下,等有時間自己再深入研究一下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章