正如其他人說傑克遜現在支持@ConstructorProperties
- 可惜的。因爲它搞砸了東西。
傑克遜應用的邏輯非常不幸。如果存在多個@ConstructorProperties
帶註釋的構造函數,它將通過一個創建對象,大多數參數爲。行動。這是一個問題,尤其是在龍目島上,其註釋所有構造函數與@ConstructorProperties
。但無論如何,這個註釋並不僅限於傑克遜。爲任何可能使用此信息的代碼檢查工具註釋每個構造函數是有意義的。龍目島就在這裏。
試想以下對象:
@Data
@Builder
@NoArgsConstructor // for Jackson
@AllArgsConstructor // for builder
public class MyDto {
private Type1 value1 = Type1.NONE;
private Type2 value2;
}
這裏傑克遜總是會使用所有參數的構造,因爲它是標註有@ConstructorProperties
並擁有大部分參數。
這也意味着如果您在您的JSON對象中只設置value2
,則value1
將變爲null
。不是你所期望的。
結論:當前行爲(當與Lombok一起使用或註釋多個構造函數時)不允許簡單的類級缺省值。
解決方法:@AllArgsConstructor(suppressConstructorProperties=true)
- 但這聲稱,因爲它的存在只是爲Java 1.5的兼容性的目的將很快過時。
Jackson 2.7添加了對構造函數屬性的支持:https://github.com/FasterXML/jackson-databind/issues/905 – Thomas 2016-04-08 18:37:17
@Thomas爲什麼不把它寫成答案?它值得更多的關注 – 2016-04-09 09:22:24