Spring Boot:具有继承性的请求体

SpringBoot: Request body with inheritance

我关注 classes

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
    }
}

当它作为主体传递给控制器​​时,它应该能够创建相应的 class。我该如何实现。

我尝试使用 JsonTypeInfoJsonSubTypes,如 this answer 所示,但它需要我在 Transmission class 内移动 transmissionType,对我来说不是这样。

您正在寻找 @JsonTypeInfo(include = As.EXTERNAL_PROPERTY) Transmission transmission。这告诉 Jackson 在包含对象 .

中查找定义类型 的 属性

就是说,如果你有任何机会改变你的 JSON 形状,你应该避免像这样的“外部标记类型”并将类型 属性 放入对象中。

在@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”。