問題描述:
有以下實體類:
@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註解校驗參數吧。這裏先記錄一下,等有時間自己再深入研究一下。