Пользовательский десериализатор Джексона для одного поля с полиморфными типами

Обновить:

Я попытался отладить исходный код Джексона и выяснить, что в методе

deserialize(JsonParser jp, DeserializationContext ctxt) из

SettableBeanProperty.java

когда_valueTypeDeserializer не нуль, он никогда не будет использовать_valueDeserializer.

Это правильное предположение, что TypeDeserializer должен быть более правильным, чем ValueDeserializer?

Я пытаюсь использовать@JsonDeserialize определить пользовательский десериализатор для одного поля с полиморфными типами. Я могу преуспеть в использовании@JsonDeserialize а также@JsonTypeInfo отдельно. Но когда я использую их вместе, кажется, что@JsonDeserialize аннотация игнорируется.

Вот моя иерархия классов:

1. Definition.java
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type", defaultImpl = Definition.class)
@JsonSubTypes({@Type(value = Definition.class, name = "normal"),
    @Type(value = FormDefinition.class, name = "form")})
public class Definition {

    private String name;
    private String description;

    // getter&setter for name&description
}
2. FormDefinition.java
public class FormDefinition extends Definition {

    private String formName;
    @JsonDeserialize(using = DefinitionDeserializer.class)
    private Definition definition;

    public String getFormName() {
        return formName;
    }

    public void setFormName(String formName) {
        this.formName = formName;
    }

    public void setDefinition(Definition definition) {
        this.definition = definition;
    }
}
3. DefinitionDeserializer.java
public class DefinitionDeserializer extends JsonDeserializer<Definition> {

    @Override 
    public Definition deserialize(JsonParser jsonParser, DeserializationContext deserializationContext)
            throws IOException, JsonProcessingException {
        Definition definition = new Definition();
        String name = jsonParser.readValueAs(String.class);
        definition.setName(name);
        return definition;
    }
}
Образец основного
public class App 
{
    public static void main( String[] args ) throws IOException {
        String sampleData = "{\"type\":\"form\",\"definition\":\"super\",\"formName\":\"FormName\"}";
        ObjectMapper mapper = new ObjectMapper();
        Definition definition = mapper.readValue(sampleData, Definition.class);
        System.out.println(definition);
    }
}

Запуск примера основного приложения вызовет исключение:

Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException: Can not instantiate value of type [simple type, class jp.co.worksap.model.Definition] from String value ('super'); no single-String constructor/factory method (through reference chain: jp.co.worksap.model.FormDefinition["definition"])

который, кажется, используетAsPropertyTypeDeserializer десериализоватьdefinition полеFormDefinition класс вместо аннотированного десериализатораDefinitionDeserializer.

Я думаю, что сложная часть здесь в том, что поле, которое я хочу использовать настраиваемый десериализатор, также типаDefinition который использует@JsonTypeInfo решить полиморфные проблемы.

Есть ли способ использовать их вместе? Благодарю.

Ответы на вопрос(1)

Ваш ответ на вопрос