Spring Boot(Netflix DGS)从Maven父模块导入GraphQL Schema
解决方案:Spring Boot + Netflix DGS 引用父模块Jar内的GraphQL Schema
不需要用Maven复制文件,直接利用DGS框架的特性和Spring资源加载机制即可实现,以下是几种可行方案:
方案1:通过DGS配置直接加载Jar内Schema
DGS支持从classpath路径读取schema,父模块Jar中resources目录下的文件本身就在classpath中,直接在子项目配置文件中指定路径即可。
- 在子项目的
application.yml中添加配置:
其中dgs: graphql: schema-locations: classpath*:schema-a/**/*.graphqls, classpath*:schema-b/**/*.graphqlsclasspath*:前缀会扫描所有classpath中的匹配资源,包括依赖Jar内的文件,刚好对应父模块的schema-a、schema-b目录。
方案2:自定义配置类加载Schema
如果需要更灵活的加载逻辑,可实现DGS的GraphQLSourceBuilderConfigurer接口手动加载:
- 创建配置类:
该方式通过Spring资源解析器读取所有classpath中的匹配资源,自动包含依赖Jar内的文件。@Configuration public class ParentSchemaLoader implements GraphQLSourceBuilderConfigurer { @Override public void configure(GraphQLSourceBuilder builder) { ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); try { // 加载父模块的schema-a目录下所有文件 Resource[] aSchemas = resolver.getResources("classpath*:schema-a/**/*.graphqls"); for (Resource schema : aSchemas) { builder.schemaResource(schema); } // 加载父模块的schema-b目录下所有文件 Resource[] bSchemas = resolver.getResources("classpath*:schema-b/**/*.graphqls"); for (Resource schema : bSchemas) { builder.schemaResource(schema); } } catch (IOException e) { throw new RuntimeException("加载父模块Schema失败", e); } } }
方案3:配置.graphqlconfig适配IDE识别
如果需要让IDE(如IntelliJ)的GraphQL插件识别父模块的Schema,可在子项目创建自己的.graphqlconfig:
- 子项目根目录新建
.graphqlconfig文件:
注意:此配置仅用于IDE的语法提示和校验,运行时仍需结合方案1或2配置加载Jar内资源。{ "projects": { "child-project": { "includes": [ "src/main/resources/schema/**/*.graphqls", "../parent-module/schema-a/**/*.graphqls", "../parent-module/schema-b/**/*.graphqls" ] } } }
关键注意事项
- 确保父模块打包时,
schema-a、schema-b目录下的.graphqls文件被正确打包到Jar的resources目录(Maven默认会打包src/main/resources下的所有文件,无需额外配置)。 - 必须使用
classpath*:前缀,而非classpath:,后者仅扫描当前项目的classpath资源。
内容的提问来源于stack exchange,提问作者juggernaut
相关产品推荐
相关产品推荐

