簡體   English   中英

在多個Maven項目中將Jackson的多態Jackson反序列化為POJO

[英]Polymorphic Jackson deserialization to POJOs in multiple Maven projects

我有一個POJO層次結構,如下所示:

@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

我想使用Jackson將一些JSON反序列化到其中。 我面臨的問題是它們分別在不同的Maven項目內(FileShare連接在FileShare maven項目內,而Connection在API maven項目內)。

結果,我在Maven項目之間有一個循環依賴關系(抽象類需要了解子類型,而子類型需要了解抽象類)。

知道如何解決這個問題嗎?

為了避免編譯時的依賴性,可以使用ObjectMapper#registerSubTypesObjectMapper#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));
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM