2016-06-16 10 views
0

を投影します。 私が直面している問題は、それぞれ異なるMavenプロジェクト(FileShare接続はFileShare mavenプロジェクト内にあり、ConnectionはAPI mavenプロジェクト内にあります)内にあることです。ポリモーフィック・ジャクソンデシリアライゼーションは、私はそうのようなPOJO階層を持つ

結果として、私はMavenプロジェクト(抽象クラ​​スはそのサブタイプについて知る必要があり、サブタイプは抽象クラスについて知る必要があります)の間に循環依存関係があります。

どのようにしてこの問題を解決できますか?

+0

抽象クラスは、あなたのサブタイプについて知っている必要があり、なぜ私は私の知る限りは、Mavenのは、円形の依存関係を許可していません知っているように...理解していませんでした。 – Sid

+0

@Typeの中にはvalue = FileShareConnection.classがあります.JsonをPOJOに多面的に逆シリアル化するためのJacksonの構文です – cyberjoac

答えて

0

コンパイル時の依存関係を避けるために、実行時にサブタイプ情報を登録するには、ObjectMapper#registerSubTypesまたはObjectMapper#registerSubTypesを使用できます。

例:

import static org.hamcrest.CoreMatchers.instanceOf; 
import static org.hamcrest.MatcherAssert.assertThat; 

import java.io.StringReader; 
import java.io.StringWriter; 

import org.junit.Test; 

import com.fasterxml.jackson.annotation.JsonTypeInfo; 
import com.fasterxml.jackson.annotation.JsonTypeName; 
import com.fasterxml.jackson.databind.ObjectMapper; 

public class JacksonTest2 { 

    // Assuming this is in base Maven module 
    @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "_type") 
    public static abstract class Connection { 
    } 

    // Assuming this is in different Maven module 
    @JsonTypeName("FileShareConnection") 
    public static class FileShareConnection extends Connection { 
    } 

    // Assuming this is in different Maven module 
    @JsonTypeName("HadoopConnection") 
    public static class HadoopConnection extends Connection { 
    } 


    // Assuming both modules are available here. 
    // or you need to load classes via reflection(or some library) 
    @Test 
    public void testUseCustomPolymorphicTypeNameInSerializationOption2() throws Exception { 
     ObjectMapper mapper = new ObjectMapper(); 

     mapper.registerSubtypes(FileShareConnection.class, HadoopConnection.class); 

     Connection fileShareConnection = new HadoopConnection(); 

     StringWriter sw = new StringWriter(); 

     mapper.writeValue(sw, fileShareConnection); 

     Connection value = mapper.readValue(new StringReader(sw.toString()), Connection.class); 

     assertThat(value, instanceOf(HadoopConnection.class)); 
    } 
} 
関連する問題