Мы используем инфраструктуру 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 со всеми полями индикатора в нем, и все ненужные значения индикатора будут установлены в ноль.
Но, как это не так, был опробован вышеупомянутый подход, когда одна из необходимых реализаций вручную устанавливается в картографе.
Пока что он хорошо работает для метода GET, в то время как во время PATCH тело автоматически отображается с помощью crnk в IndicatorTimeEntry, и значения индикатора1 / 2 теряются. Можно ли расширить / выполнить ручное сопоставление от JSON до необходимого ребенка? Или, может быть, можно попробовать другой подход?