Весеннее моделирование: поле как интерфейс - PullRequest
0 голосов
/ 22 мая 2018

Есть ли способ поместить поле внутри модели документа в качестве интерфейса?Пример:

public class Foo {
    private String id;
    private Bar bar;
}

Где Bar - это интерфейс с несколькими реализациями.Внутри Bar есть сигнатура метода String getType(), которая сообщает мне, какую реализацию я могу использовать для отображения данных из БД.

Я пробовал разные решения (@ReadingConverter / @WiritingConverter,@JsonSerialize / @JsonDeserialize) без результатов.Каждый раз, когда я получаю

Failed to instantiate [Bar]: Specified class is an interface

Любая помощь?Спасибо!

1 Ответ

0 голосов
/ 22 мая 2018

Похоже, вы хотите полиморфную сериализацию / десериализацию.Вы должны посмотреть на документы Джексона для этого: http://www.baeldung.com/jackson-advanced-annotations

Короче говоря, вы захотите сделать что-то вроде этого, где аннотация @JsonTypeIdResolver используется для определения распознавателя пользовательского типа:

@JsonTypeInfo(use = @JsonTypeInfo(
    use = JsonTypeInfo.Id.NAME, 
    include = JsonTypeInfo.As.PROPERTY, 
    property = "@type"
)
@JsonTypeIdResolver(BarTypeIdResolver.class)
public interface Bar {
    ...
}

public class BarTypeIdResolver extends TypeIdResolverBase {
    // boilerplate skipped, see the documentation
     
    @Override
    public String idFromValueAndType(Object obj, Class<?> subType) {
        String typeId = null;
        if (obj instanceof Bar) {
            Bar bar = (Bar) obj;
            typeId = bar.getType();
        }
        return typeId;
    }
 
    @Override
    public JavaType typeFromId(DatabindContext context, String id) {
        Class<?> subType = null;
        switch (id) {
        case "barImpl1":
            subType = BarImpl1.class;
            break;
            ...
        }
        return context.constructSpecializedType(superType, subType);
    }
}
...