我如何在Java/Jackson中编程配置ObjectMapper来实例化Java Bean



我有许多Java bean接口:

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的混凝土类型?

具体来说,我可以得到地图<班级?>,class<?>> API类型的实现混凝土类型,但不知道如何将其"给予"给对象贴片,因此它了解如何从API类型中查找混凝土类型,以便可以实例化它们。我该如何完成?

这可以使用SimpleAbsTractTyPeresolver完成。

此链接向您展示了如何将映射添加到解析器:杰克逊 - 如何为接口引用的避免化指定单个实现?


这就是您将解析器添加到对象拍摄者的方式:

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

最新更新