2016-12-17 6 views
0

У меня есть несколько интерфейсов Java Bean, как это:Как программно настроить ObjectMapper в Java/Jackson для создания Java-компонентов?

public interface Dog 
{ 
String getName(); 
void setName(final String value); 
} 

Я также автоматически генерировать реализации фасоли, как это:

public final class DogImpl implements Dog 
{ 
public String getName() 
{ 
    return m_name; 
} 

public void setName(final String value) 
{ 
    m_value = value; 
} 

private volatile String m_value; 
} 

ObjectMapper работает прекрасно, за исключением, когда я начала гнездования эти бобы, как это:

public interface Dog 
{ 
String getName(); 
void setName(final String value); 

Dog getParent(); 
void setParent(final Dog value); 
} 

Я получаю эту ошибку:

абстрактные типы либо должны быть сопоставлены с конкретными типами, имеют пользовательский десериализатор, либо содержат дополнительную информацию о типе.

Он жалуется, потому что определение bean - это интерфейс, а не конкретный тип. Мой вопрос в том, есть ли способ определить отображение типов интерфейса для конкретных типов для ObjectMapper через модуль или что-то еще?

В частности, я могу получить карту < Класс <? >, Класс <? >> типа api для конкретного типа реализации, но не имеют понятия, как «дать это» ObjectMapper, чтобы он понимал, как искать конкретные типы из типов api, чтобы он мог их создавать. Как это сделать?

ответ

0

Это можно сделать с помощью SimpleAbstractTypeResolver.

Эта ссылка показывает, как добавить отображения в распознаватель: Jackson - How to specify a single implementation for interface-referenced deserialization?


И это, как вы добавляете распознаватель к ObjectMapper:

 final SimpleAbstractTypeResolver resolver = new SimpleAbstractTypeResolver(); 
     for (final Class<?> api : apis) 
     { 
      resolver.addMapping(api, getConcreteImpl(api)); 
     } 

     final SimpleModule module = new SimpleModule(); 
     module.setAbstractTypes(resolver); 
     mapper.registerModule(module);