[英]SpringBoot: Request body with inheritance
我有以下課程
public class Car {
private String make;
private String model;
private TransmissionType transmissionType; // Manual/Automatic
private Transmission transmission;
}
public class Transmission {
}
public class AutomaticTransmission {
public Technology technology; // DCT/CVT/AMT
}
public class ManualTransmission {
public int numGears;
}
在這個例子中,當傳遞的有效載荷可能是
{
"make": "Toyota",
"model": "Iris",
"transmissionType": "Automatic",
"transmission" {
"technology": "DCT"
}
}
或者它可能是
{
"make": "Merc",
"model": "C",
"transmissionType": "Manual",
"transmission" {
"numGears": 5
}
}
當它作為主體傳遞給 controller 時,它應該能夠創建相應的 class。 我如何做到這一點。
我嘗試使用JsonTypeInfo
和JsonSubTypes
如this answer所示,但它需要我在Transmission
class 中移動transmissionType
類型,這對我來說不是這種情況。
您正在尋找@JsonTypeInfo(include = As.EXTERNAL_PROPERTY) Transmission transmission
。 這告訴 Jackson在包含 object中查找定義類型的屬性。
也就是說,如果你有機會改變你的 JSON 形狀,你應該避免像這樣的“外部標記類型”,並將 type 屬性放入 object。
在@chrylis 的幫助下。
我寫的代碼如下
class Car {
...
private TransmissionType transmissionType;
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXTERNAL_PROPERTY, property = "transmissionType")
private Transmission transmission;
}
@JsonSubTypes({
@JsonSubTypes.Type(value = AutomaticTransmission.class, name = "AUTOMATIC"),
@JsonSubTypes.Type(value = ManualTransmission.class, name = "MANUAL")
})
public abstract class Transmission {
}
我發現很少有陷阱,提到僅供參考。
如果您將JsonSubTypes
放在Car
class 中的字段上,則 Swagger 文檔將不起作用。 如果你把@JsonTypeInfo
放在 class Transmission
上,那么 SpringBoot 將無法識別“transmissionType”字段。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.