【发布时间】:2020-12-02 20:13:15
【问题描述】:
我将 Json Book 请求定义为
{
"book" : {
"type" : "PRINT",
"value" : {
"weight" : "1lb"
}
}
}
或
{
"book" : {
"type" : "EBOOK",
"value" : {
"size" : "1MB"
}
}
}
Value 是一个多态对象。
我将我的 Java POJO 定义如下。我将value 定义为多态对象。
@Getter
@Builder
@JsonDeserialize(builder = BookRequest.BookRequestBuilder.class)
public class BookRequest
{
@NonNull
private Book book;
}
书被定义为
@Builder
@Getter
@JsonDeserialize(builder = Book.BookBuilder.class)
public class Book
{
@NonNull
private BookType type;
@NonNull
private BookValue value;
}
BookValue 被定义为一个多态对象。
public interface BookValue
{
}
PrintBook 是一种类型
@Getter
@Builder
@JsonDeserialize(builder = PrintBook.PrintBookBuilder.class)
public class PrintBook implements BookValue
{
private String weight;
}
书籍类型定义为枚举
@Getter
public enum BookType
{
EBOOK,
PRINT
}
当我尝试使用以下代码反序列化 PRINT book json 时
public deserializePrintBook{
ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
try {
JsonNode node = createJsonNodeFromFile("src/jacksonannotations/resources/sampleBook.json");
BookRequest br = mapper.treeToValue(node, BookRequest.class);
System.out.println(br);
}
catch (Exception e ) {
e.printStackTrace();
}
}
public static JsonNode createJsonNodeFromFile(final String filePath) throws Exception
{
ObjectMapper objectMapper = new ObjectMapper();
File file = new File(filePath);
JsonNode testMessageEnvelope = objectMapper.readValue(
file,
JsonNode.class);
return testMessageEnvelope;
}
但是,我收到了这个错误
com.fasterxml.jackson.databind.exc.InvalidDefinitionException:无法构造
jacksonannotations.books.BookValue的实例(没有创建者,如默认构造函数,存在):抽象类型要么需要映射到具体类型,要么具有自定义反序列化器,要么包含附加类型信息 在 [来源:未知;行:-1,列:-1](通过引用链:jacksonannotations.books.BookRequest$BookRequestBuilder["book"]->jacksonannotations.books.Book$BookBuilder["value"])
我已经查看了Cannot construct instance of - Jackson,但这没有帮助。
有人可以帮助我理解我是否正确地对上述示例中的 Java pojo 建模?
谢谢, 帕万
【问题讨论】:
标签: java json jackson polymorphism jackson-databind