GraphQL客户端子项目类型重定义错误的解决方法求助
解决多模块GraphQL项目中类型重复定义的错误
问题原因
父项目同时加载了两个子项目的schema.graphqls文件,导致GraphQL核心类型(如Mutation)以及业务类型(如Order、Product)被重复定义,而GraphQL规范禁止同一类型在schema中多次定义。
解决方案
1. 提取公共类型到独立模块
- 新建一个独立的公共模块(例如
common-graphql),将两个项目中重复的类型(包括Order、Product、PaymentMethod,以及关联的OrderConnection、OrderEdge等)迁移到该模块的schema.graphqls中。 - 调整父项目的模块依赖顺序,先引入公共模块,再引入项目A和B:
<modules> <module>../common-graphql</module> <module>../projectA</module> <module>../projectB</module> </modules> - 项目A和B的
schema.graphqls仅保留各自独有的类型与扩展逻辑:- 若子项目需要扩展公共类型(比如为
Mutation添加专属字段),使用extend关键字替代重新定义:# 项目A的schema.graphqls extend type Mutation { createOrderForA(input: CreateOrderInput!): Order! }
- 若子项目需要扩展公共类型(比如为
2. 为子项目配置独立的Schema加载路径
如果父项目仅用于模块管理,不需要运行GraphQL服务,可让每个子项目单独控制Schema加载范围:
- 以Spring Boot项目为例,在每个子项目的
application.properties中指定仅加载当前项目的Schema文件:# 项目A的配置 graphql.schema.locations=classpath:schema.graphqls - 确保构建工具(如Maven/Gradle)不会将其他模块的
schema.graphqls复制到当前项目的资源目录,避免被误加载。
3. 统一使用类型扩展替代重复定义
对于部分相同但存在差异的类型,避免重复编写完整类型定义,改用extend关键字扩展基础类型:
# 公共模块定义基础Order类型 type Order { id: ID! number: String! total: Float! } # 项目A扩展Order类型添加专属字段 extend type Order { customerIdForA: String! }
注意事项
- 所有子项目的
Mutation、Query根类型必须通过extend扩展公共根类型,禁止重复定义type Mutation或type Query。 - 检查构建脚本中的资源复制规则,确保不同模块的Schema文件不会被合并到同一输出目录。
内容的提问来源于stack exchange,提问作者H Nakazawa
相关产品推荐
相关产品推荐

