我有许多像这样的Java bean接口:
public interface Dog
{
String getName();
void setName( final String value );
}
我也像这样自动生成bean实现:
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工作正常,除非我开始嵌套这些bean:
public interface Dog
{
String getName();
void setName( final String value );
Dog getParent();
void setParent( final Dog value );
}
我收到此错误:
抽象类型要么需要映射到具体类型,要么具有自定义反序列化器,要么包含其他类型信息
它抱怨,因为bean定义是一个接口而不是具体类型。我的问题是,我是否有办法通过模块或其他东西定义接口类型到ObjectMapper的具体类型的映射?
具体来说,我可以得到一张地图<类< ? >,Class< ? > > api类型的实现具体类型,但不知道如何“给这个”到ObjectMapper,所以它理解如何从api类型中查找具体类型,以便它可以实例化它们。我该如何做到这一点?
答案 0 :(得分: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 );