我们使用 crnk 框架来实现 json-api。PATCH 的 GET/请求正文有一个响应正文:
{
"data": {
"id": "1",
"type": "v1/indicator-data",
"attributes": {
"indicatorValues": [
{
"time": "2018-03-25T00:00:00Z",
"indicator1": 50
},
{
"time": "2018-03-26T00:00:00Z",
"indicator1": 50
}
]
}
}
}
但是根据一些外部标志,主体和返回的指标可能会略有不同:
{
"data": {
"id": "2",
"type": "v1/indicator-data",
"attributes": {
"indicatorValues": [
{
"time": "2018-03-25T00:00:00Z",
"indicator2": 15
},
{
"time": "2018-03-26T00:00:00Z",
"indicator2": 15
}
]
}
}
}
为了实现这一点,我创建了以下层次结构:
@JsonApiResource(type = "v1/indicator-data")
public class IndicatorDataDTO {
@JsonApiId
private int id;
private List<IndicatorTimeEntry> indicatorValues;
}
public class IndicatorTimeEntry {
private ZonedDateTime time;
}
public class Indicator1TimeEntry extends IndicatorTimeEntry {
private Double indicator1;
}
public class Indicator2TimeEntry extends IndicatorTimeEntry {
private Double indicator2;
}
如果支持 @JsonInclude,则只有 1 个 TimeEntry 类,其中包含所有指标字段,并且所有不必要的指标值都将设置为 null。
但事实并非如此,因此尝试了上述方法,其中一种必要的实现是在映射器中手动设置的。
到目前为止,它适用于 GET 方法,而在 PATCH 期间,主体由 crnk 自动映射到 IndicatorTimeEntry 并且 indicator1/2 值丢失。是否可以扩展/执行从 json 到必要的 dto 子类的手动映射?或者也许可以尝试另一种方法?