如何以编程方式在Java / Jackson中配置ObjectMapper以实例化Java bean?

时间:2016-12-17 21:07:55

标签: jackson objectmapper

我有许多像这样的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类型中查找具体类型,以便它可以实例化它们。我该如何做到这一点?

1 个答案:

答案 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 );