【问题标题】:SpringBoot: Request body with inheritanceSpring Boot:具有继承的请求正文
【发布时间】:2021-04-19 06:02:22
【问题描述】:

我有以下课程

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

当它作为主体传递给控制器​​时,它应该能够创建相应的类。我如何做到这一点。

我尝试使用JsonTypeInfo 和JsonSubTypes,如this answer 所示,但我必须在Transmission 类中移动transmissionType,这对我来说不是这样。

【问题讨论】:

标签: java spring-boot parsing jackson


【解决方案1】:

您正在寻找@JsonTypeInfo(include = As.EXTERNAL_PROPERTY) Transmission transmission。这告诉 Jackson 在包含对象中查找定义类型的属性。

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

【讨论】:

  • 那行得通。谢谢。我添加了完整代码的答案,以便对其他人有所帮助。
【解决方案2】:

借助@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 类的字段上,则 Swagger 文档将不起作用。如果你把 @JsonTypeInfo 放在 Transmission 类上,那么 SpringBoot 将无法识别字段“transmissionType”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-18
    • 2020-10-18
    • 2021-01-10
    • 2019-03-27
    • 1970-01-01
    • 2021-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多