2016-12-17 3 views
0

私はこのようなJava Beanのインタフェースの数を持っている:Java Beanをインスタンス化するためにJava/JacksonでObjectMapperをプログラムで設定するにはどうすればよいですか?

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

私はこのようなこれらのBeanを入れ子に起動したときを除いて完璧に動作しますObjectMapperを:

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

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

私はこのエラーを取得する:

抽象型は、具体的な型にマップする必要があり、カスタムデシリアライザを持つか、追加の型情報を含む必要があります。

Beanの定義が具体的な型ではなくインターフェイスなので、私の質問は、モジュールや何かを介してObjectMapperの具体的な型へのインタフェース型のマッピングを定義する方法があるかどうかです。

具体的には、私はマップ<クラス<を得ることができますか? >、クラス<? >>を実装具体的な型に変換することはできますが、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); 
関連する問題