如何在Java Spring Boot 3.2中配置多个GraphQL端点
Spring Boot 3.2 配置多GraphQL端点方案
针对Spring Boot 3.2 + official GraphQL starter(spring-boot-starter-graphql:3.2.0),要新增第二个/api GraphQL端点,可通过自定义GraphQL数据源+控制器映射的方式实现,步骤如下:
1. 分离Schema文件
将第二个端点的Schema文件单独存放,避免和默认端点混淆:
- 默认端点Schema:
src/main/resources/graphql/schema.graphqls(保持原有位置) /api端点Schema:src/main/resources/graphql/api/schema.graphqls
2. 配置独立的GraphQL数据源
创建配置类,为两个端点分别生成独立的GraphQLSource Bean,确保各自加载对应的Schema和自定义逻辑:
@Configuration public class MultiGraphQLConfig { // 默认/graphql端点的数据源(复用原有配置) @Bean @Primary public GraphQLSource defaultGraphQLSource(GraphQLSchemaBuilder schemaBuilder) { return schemaBuilder .schemaResources("classpath:graphql/schema.graphqls") .build(); } // /api端点的数据源 @Bean(name = "apiGraphQLSource") public GraphQLSource apiGraphQLSource(GraphQLSchemaBuilder schemaBuilder) { return schemaBuilder .schemaResources("classpath:graphql/api/schema.graphqls") // 自定义该端点的RuntimeWiring(比如绑定专属DataFetcher) .runtimeWiring(wiring -> wiring .type("Query", typeWiring -> typeWiring .dataFetcher("apiSpecificQuery", new ApiDataFetcher()) ) ) .build(); } }
3. 注册/api端点控制器
通过@RestController创建专属控制器,处理/api路径的GraphQL请求,调用对应数据源执行查询:
@RestController @RequestMapping("/api") public class ApiGraphQLController { private final GraphQL apiGraphQL; // 通过@Qualifier指定注入/api端点的数据源 public ApiGraphQLController(@Qualifier("apiGraphQLSource") GraphQLSource apiGraphQLSource) { this.apiGraphQL = apiGraphQLSource.graphQL(); } @PostMapping public ResponseEntity<Object> handleApiGraphQLRequest( @RequestBody GraphQLRequest request) { ExecutionInput input = ExecutionInput.newExecutionInput() .query(request.getQuery()) .variables(request.getVariables()) .operationName(request.getOperationName()) .build(); ExecutionResult result = apiGraphQL.execute(input); return ResponseEntity.ok(result.toSpecification()); } // 用于接收GraphQL请求体的DTO public static class GraphQLRequest { private String query; private Map<String, Object> variables; private String operationName; // 生成getter和setter public String getQuery() { return query; } public void setQuery(String query) { this.query = query; } public Map<String, Object> getVariables() { return variables; } public void setVariables(Map<String, Object> variables) { this.variables = variables; } public String getOperationName() { return operationName; } public void setOperationName(String operationName) { this.operationName = operationName; } } }
4. 可选:配置/api端点的GraphiQL调试页面
官方starter默认只提供一个GraphiQL页面,若需要为/api端点单独配置调试页面,可自定义静态资源映射:
@Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { // 自定义/api/graphiql路径的调试页面,需自行准备GraphiQL静态文件 registry.addResourceHandler("/api/graphiql/**") .addResourceLocations("classpath:/graphiql/api/"); } }
注意事项
- 两个
GraphQLSourceBean需通过@Primary和@Qualifier区分,避免依赖注入冲突 - 若需共享部分DataFetcher,可将其封装为独立Bean,分别注入到不同的
RuntimeWiring中 - 测试时分别向
/graphql和/api发送POST请求,请求体格式与默认端点一致
内容的提问来源于stack exchange,提问作者Ebad
相关产品推荐
相关产品推荐

