Spring GraphQL中Union类型实现报错及解决方案咨询
问题解决:GraphQL Union类型查询报错
错误原因
报错提示"You have asked for named object type 'Tables', but it's not an object type but rather a 'graphql.schema.GraphQLUnionType'",核心原因:
- GraphQL的Union类型不属于对象类型范畴,不能直接作为列表元素进行无差别查询,必须通过inline fragment明确指定每个Union成员类型的查询字段
- 原Schema中Union成员类型名使用小写(
address、identifier),不符合GraphQL类型名PascalCase的规范,可能引发类型映射异常
解决方案步骤
- 修正GraphQL Schema,确保Union成员为合法的PascalCase命名对象类型,并补充对象类型的字段定义
- 修改查询语句,通过inline fragment指定每个Union成员的查询字段
- 调整Java代码,确保返回类型能被Spring GraphQL正确识别为Union类型的集合
修改后的代码示例
1. 修正后的GraphQL Schema
type Query { getData: [Tables] } # Union类型成员使用PascalCase命名规范 union Tables = Address | Identifier # 定义Address对象类型及对应字段(根据你的Hibernate实体补充) type Address { id: ID! street: String city: String } # 定义Identifier对象类型及对应字段(根据你的Hibernate实体补充) type Identifier { id: ID! code: String type: String }
2. 正确的查询语句(必须包含inline fragment)
query allData { getData { __typename # 针对Address类型的字段查询 ... on Address { id street city } # 针对Identifier类型的字段查询 ... on Identifier { id code type } } }
3. 调整后的Java查询方法
@QueryMapping public List<Object> getData() { // 可混合返回Address和Identifier实例,Spring GraphQL会自动识别类型 return List.of(new Address(1L, "Main St", "New York"), new Identifier(2L, "USER_001", "USER")); }
额外说明
- 确保Hibernate实体
Address和Identifier已被Spring GraphQL正确映射为对应的GraphQL对象类型(可通过@GraphQLType注解或schema自动匹配实现) - 若使用代码优先方式定义GraphQL类型,可通过
@GraphQLUnion注解声明Union类型,更灵活地控制类型映射
内容的提问来源于stack exchange,提问作者SwimmingHigh
相关产品推荐
相关产品推荐

