2016-06-16 8 views
0

ich eine POJO Hierarchie wie so haben:Polymorphe Jackson Deserialisierung POJOs in mehreren Maven Projekte

@JsonSubTypes({ 
    @Type(value = FileShareConnection.class, name = "FileShareConnection"), 
    @Type(value = HadoopConnection.class, name = "HadoopConnection") 
}) 
public abstract class Connection 
public class FileShareConnection extends Connection 
public class HadoopConnection extends Connection 

ich einige JSON deserialisieren wollen hinein Jackson verwenden. Das Problem, dem ich gegenüberstehe, ist, dass sie sich jeweils in einem anderen Maven-Projekt befinden (FileShare-Verbindung befindet sich in einem FileShare-Maven-Projekt und Connection in einem API-Maven-Projekt).

Als Ergebnis habe ich eine zirkuläre Abhängigkeit zwischen Maven-Projekten (die abstrakte Klasse muss wissen über die Subtypen und die Subtypen müssen über die abstrakte Klasse wissen).

Irgendeine Idee, wie ich dieses Problem lösen könnte?

+0

Ich verstand nicht, warum die abstrakte Klasse muss über Ihre Subtypen wissen .. soweit ich weiß nicht, Maven zirkuläre Abhängigkeiten nicht gestattet. – Sid

+0

Innerhalb @Type gibt es Wert = FileShareConnection.class, das ist die Syntax von Jackson für polymorphe Deserialisierung von Json in POJOs – cyberjoac

Antwort

0

Um die Kompilierzeitabhängigkeit zu vermeiden, können Sie die Untertypinformationen zur Laufzeit mithilfe der ObjectMapper#registerSubTypes oder ObjectMapper#registerSubTypes registrieren.

Beispiel:

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)); 
    } 
} 
Verwandte Themen