Spring GraphQL动态修改枚举后,GraphiQL未显示更新Schema如何解决?
问题分析
你通过GraphQLTypeVisitor在运行时修改了内存中的GraphQLSchema实例,但GraphiQL默认加载的是原始静态SDL文件,两者不同步,导致界面无法显示新增的枚举项。
解决方案
下面提供两种可行的同步方案:
方案一:动态生成SDL资源供GraphiQL加载
通过自定义Bean生成更新后的SDL字符串,让GraphiQL直接使用这个动态资源:
- 修改配置类,添加动态SDL生成Bean
@Configuration(proxyBeanMethods = false) class GraphQlConfig { @Bean public GraphQlSourceBuilderCustomizer sourceBuilderCustomizer() { return builder -> builder.typeVisitors(List.of(new AssetGraphQlVisitor())); } // 生成包含动态枚举的SDL资源 @Bean public Resource graphQlDynamicSchema(GraphQLSchema schema) { // 使用graphql-java的SchemaPrinter打印运行时Schema为SDL String updatedSdl = SchemaPrinter.print(schema); return new ByteArrayResource(updatedSdl.getBytes(StandardCharsets.UTF_8)); } }
- 在配置文件中指定GraphiQL使用该动态资源
# 替换默认的静态SDL路径,指向我们的动态Bean spring.graphql.graphiql.schema-location=bean:graphQlDynamicSchema
方案二:自定义Schema接口供GraphiQL拉取
通过Controller暴露接口返回运行时Schema的SDL,让GraphiQL从该接口获取最新Schema:
- 创建Schema接口Controller
@RestController @RequestMapping("/graphql") public class DynamicSchemaController { private final GraphQLSchema graphQLSchema; // 注入运行时的GraphQLSchema实例 public DynamicSchemaController(GraphQLSchema graphQLSchema) { this.graphQLSchema = graphQLSchema; } @GetMapping("/dynamic-schema") public String getDynamicSchema() { return SchemaPrinter.print(graphQLSchema); } }
- 在配置文件中指定GraphiQL的Schema拉取地址
spring.graphql.graphiql.schema-url=/graphql/dynamic-schema
注意事项
SchemaPrinter是graphql-java核心库中的类,确保项目依赖正确引入- 如果数据库中的枚举项会动态变更,需要额外实现Schema刷新逻辑(比如监听数据库事件,重新生成并替换运行时Schema)
- 配置完成后重启服务,打开GraphiQL即可看到更新后的枚举项
内容的提问来源于stack exchange,提问作者Oromis
相关产品推荐
相关产品推荐

