You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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/");
    }
}

注意事项

  • 两个GraphQLSource Bean需通过@Primary和@Qualifier区分,避免依赖注入冲突
  • 若需共享部分DataFetcher,可将其封装为独立Bean,分别注入到不同的RuntimeWiring中
  • 测试时分别向/graphql和/api发送POST请求,请求体格式与默认端点一致

内容的提问来源于stack exchange,提问作者Ebad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 21:13:14