Как использовать динамическую десериализацию c для свойства с помощью JsonSubTypes? - PullRequest
1 голос
/ 10 марта 2020

У меня есть класс Food, который необходимо использовать в качестве класса десериализации.

public class Food {

    private VegetableConfiguration vegetableConfiguration;
    private Color color;

    // ...
    // Getters/Setters
}
public interface VegetableConfiguration {
    // ...
}
public class PotatoConfiguration implements VegetableConfiguration {
    // ...
}
public class CarrotConfiguration implements VegetableConfiguration {
    // ...
}
public class PepperConfiguration implements VegetableConfiguration {
    // ...
}
public enum Color {
    BROWN, ORANGE, RED
}

Мне нужно выбрать реализацию VegetableConfiguration на основе Color Я получаю из ответа.

Я пытаюсь использовать JsonTypeInfo форму Джексона. В соответствии с JavaDo c его можно использовать для свойства.

public class Food {


    @JsonTypeInfo(
            use = JsonTypeInfo.Id.NAME,
            property = "color")
    @JsonSubTypes({
            @JsonSubTypes.Type(value = PotatoConfiguration.class, name = "BROWN"),
            @JsonSubTypes.Type(value = CarrotConfiguration.class, name = "ORANGE"),
            @JsonSubTypes.Type(value = PepperConfiguration.class, name = "RED"),
    })
    private VegetableConfiguration vegetableConfiguration;
    private Color color;

    // ...
    // Getters/Setters
}

, но происходит сбой со следующей ошибкой

org.springframework.web.client.RestClientException: Error while extracting response for type [Food] and content type [application/json;charset=UTF-8]; nested exception is org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Missing type id when trying to resolve subtype of [simple type, class VegetableConfiguration]: missing type id property 'color' (for POJO property 'vegetableConfiguration'); nested exception is com.fasterxml.jackson.databind.exc.InvalidTypeIdException: Missing type id when trying to resolve subtype of [simple type, class VegetableConfiguration]: missing type id property 'color' (for POJO property 'vegetableConfiguration')

Как заставить его выбрать реализацию для VegetableConfiguration на десериализацию в зависимости от color?

Желательно без реализации пользовательского десериализатора.

1 Ответ

1 голос
/ 10 марта 2020

Вам необходимо использовать JsonTypeInfo.As.EXTERNAL_PROPERTY . Из документации:

Механизм включения аналогичен PROPERTY, , за исключением того, что свойство включено на один уровень выше в иерархии , т. Е. Как свойство элемента на том же уровне, что и JSON Объект печатать. Обратите внимание, что этот выбор может использоваться только для свойств, но не для типов (классов). Попытка использовать его для классов приведет к включению стратегии basi c PROPERTY.

См. Также:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...