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。我该如何实现。
我尝试使用 JsonTypeInfo
和 JsonSubTypes
,如 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”。
我关注 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。我该如何实现。
我尝试使用 JsonTypeInfo
和 JsonSubTypes
,如 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”。