簡體   English   中英

SpringBoot:請求正文與 inheritance

[英]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。 我如何做到這一點。

我嘗試使用JsonTypeInfoJsonSubTypesthis 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM