Ручное сопоставление Json с одним из дочерних классов DTO в crnk - PullRequest
0 голосов
/ 02 июля 2018

Мы используем инфраструктуру 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 до необходимого ребенка? Или, может быть, можно попробовать другой подход?

...