【问题标题】:How do I programmatically configure ObjectMapper in Java/Jackson to instantiate Java beans?如何以编程方式在 Java/Jackson 中配置 ObjectMapper 以实例化 Java bean?
【发布时间】:2016-12-17 21:07:54
【问题描述】:

我有很多这样的 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 定义接口类型到具体类型的映射?

具体来说,我可以得到一个 Map, 类> api 类型到实现具体类型,但不知道如何“给这个”给 ObjectMapper,因此它了解如何从 api 类型中查找具体类型,以便实例化它们。我该如何做到这一点?

【问题讨论】:

    标签: jackson objectmapper


    【解决方案1】:

    这可以使用 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 );
    

    【讨论】:

      猜你喜欢
      • 2011-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-29
      • 2013-08-11
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      相关资源
      最近更新 更多