【发布时间】:2022-01-11 10:21:33
【问题描述】:
在jackson中,我们可以使用注解
- @JsonTypeInfo
- @JsonSubTypes
- @JsonSubTypes.Type
实现多态序列化。
我们可以选择
- 直接在数据模型上使用这些注解,这是最简单的方法。
- 在 mixin 上使用这些注释。这是一个关于它的链接Polymorphic deserialization in Jackson without annotations。
这两种方案都有一个问题:编写代码时必须知道所有的子类。
在 GraphQL 中
- 鉴别器字段是固定的:“__typename”
- 子类型名称也是固定的:Java 类的简单名称
所有需求都是固定的,这意味着不需要一个个配置子类型,可以创建一个杰克逊模块来自动处理它们。
// An empty interface
// Developers need not to configure polymorphic metadata for any class of its subtypes
public interface GraphQLObject {}
public class BookStore implements GraphQLObject {
public List<Book> getBooks() {...}
...other gettes/setters...
}
public abstract class Book implements GraphQLObject {
... some properties ...
}
public class ElectronicBook extends Book {
... some properties ...
}
public class PaperBook extends Book {
... some properties ...
}
使用代码如下所示
BookStore store = ...;
ObjectMapper mapper = new ObjectMapper();
mapper.addModule(new GraphQLModule());
System.out.println(mapper.writeValueAsString(store));
这里,我们需要创建“GraphQLModule”,它可以处理所有子类型实现空接口“GraphQLObject”,并告诉jackson如何使用每个子类型的简单类名作为判别器字段“__typename”的值"
结果应该是这样的:
{
name: "store",
books: [
{ __typename: "ElectronicBook", name: "book-1" },
{ __typename: "PaperBook", name: "book-2" }
]
}
是否可以实现“GraphQLModule”?
注意:
与jackson默认的多态行为一样,只有当对象运行时类型与编译时已知的list的泛型类型参数不同时才需要添加discriminator字段。
【问题讨论】: