GraphQL-Java中如何处理运行时多态(Runtime Polymorphism)
GraphQL Schema适配Java运行时多态的实现方案
核心问题说明
你之前的写法将Parent和Child定义为完全独立的GraphQL对象类型,二者没有显式关联,GraphQL强类型系统不允许跨独立类型赋值,因此无法适配Java的类继承多态特性。
方案1:使用Interface(推荐,适用于有公共字段的继承场景)
将父类的公共字段抽为接口,所有继承父类的子类实现该接口,即可实现多态适配:
# 定义公共接口,声明父类的公共字段 interface Parent { libraryName: String } # Child实现Parent接口,继承公共字段+定义自有字段 type Child implements Parent { libraryName: String bookName: String } # 如果Parent本身会被实例化,额外定义Parent的实现类型 type ParentImpl implements Parent { libraryName: String } # Test类中childObj声明为Parent接口类型,可接收所有实现了Parent的类型实例 type Test{ id: String! childObj: Parent }
查询注意事项:如果需要获取子类独有字段,需要使用内联片段指定类型:
query getTest($id: String!) { test(id: $id) { id childObj { libraryName # 公共字段可直接查询 ... on Child { bookName # 子类独有字段需用内联片段声明 } } } }
方案2:使用Union(适用于无公共字段的多态场景)
如果后续Parent和Child可能扩展出完全无关的字段,可使用联合类型声明:
# 定义联合类型,包含所有可能的多态类型 union ParentOrChild = Parent | Child type Parent { libraryName: String } type Child { libraryName: String bookName: String } type Test{ id: String! childObj: ParentOrChild }
查询注意事项:联合类型没有公共字段,所有字段查询都需要声明对应的内联片段。
Java端适配要求
如果你使用Spring for GraphQL、Netflix DGS等框架,实体类的继承关系会被自动识别,无需额外配置。如果使用原生GraphQL Java,需要为接口/联合类型注册TypeResolver,根据运行时的Java对象实例返回对应的GraphQL类型名称即可。
内容的提问来源于stack exchange,提问作者Baljinder Singh
相关产品推荐
相关产品推荐

