我有一个带有观察资源的REST API,其属性为observationType和observationValue。observationType的一些有效值有:HEART_RATE, BLOOD_PRESSURE, ORTHOSTATIC_BLOOD_PRESSURE。
根据observationType, observationValue字段可能包含不同的数据类型,HEART_RATE为整型,BODY_WEIGHT为双精度,blood _pressure为双精度。我们需要一些东西来显示收缩压和舒张压的值,像这样:
{
"observationType": "HEART_RATE"
"observationValue": 90
}
{
"observationType": "BODY_WEIGHT"
"observationValue": 81.5
}
{
"observationType": "BLOOD_PRESSURE"
"observationValue": {"systolicBloodPressureValue": 120, "diastolicBloodPressureValue": 80}
}
在REST API中建模的好方法是什么?,我不期望实现它的最佳选择,但通常我们如何实现它?这个行业有哪些模式?
我应该只是返回一个字符串值为observationValue?
看起来在REST API中拥有多态性会是一种混乱。
实现这一点的一种方法是使用Jackson的多态类型支持。将数据建模为:
public interface Observation<T> {
T getObservationValue();
}
并实现它,例如:
public class HeartRateObservation implements Observation<Integer> {
private Integer observationValue;
public void setObservationValue(Integer value) {
this.observationValue = value;
}
@Override
public Integer getObservationValue() {
return observationValue;
}
}
public class BodyWeightObservation implements Observation<Float> {
// ...
}
public class BloodPressureValue {
private float systolicBloodPressureValue;
private float diastolicBloodPressureValue;
// other members, getters and setters
}
public class BloodPressureObservation implements Observation<BloodPressureValue> {
// ...
}
现在是Jackson特有的部分:您必须指示Jackson使用类型info来(反)序列化您的类。将之前的模型修改如下:
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME, // (1)
include = JsonTypeInfo.As.PROPERTY, // (2)
property = "observationType" // (3)
)
public interface Observation<T> { ... }
并将名称添加到实现中:
@JsonTypeName("HEART_RATE") // (4)
public class HeartRateObservation implements Observation<Integer> { ... }
@JsonTypeName("BODY_WEIGHT")
public class BodyWeightObservation implements Observation<Float> { ... }
@JsonTypeName("BLOOD_PRESSURE")
public class BloodPressureObservation implements Observation<BloodPressureValue> { ... }
配置可以解释为:
- 使用自定义名称来标识确切的子类型…
- …把它放到对象的属性中…
- …(属性是)叫做
observationType
- …对于
HeartRateObservation
类型,其值为"HEART_RATE"
免责声明1:我还没有运行代码,它可能需要一些调整,如果遇到问题请告诉我。
免责声明2:这是使用Jackson的一种方法——我承认我不知道你是否在使用Jackson。还有其他有效的解决方案。