我们使用crnk框架实现json-api。 GET的响应正文/ PATCH的请求正文:
{
"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 child calss?还是可以尝试其他方法?