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

如何使用DgsQueryExecutor测试动态生成的GraphQL Schema?

解决DGS动态Schema测试时@DgsTypeDefinitionRegistry不生效的问题

问题根源

测试环境下DGS默认优先加载schema.graphql文件,哪怕是空文件也会以此为基础构建Schema,导致你用@DgsTypeDefinitionRegistry动态注册的类型定义没被合并;同时@DgsTypeDefinitionRegistry的Bean可能没被测试上下文正确扫描初始化。

具体解决步骤

1. 确保动态Schema注册类被测试上下文扫描到

如果你的@DgsTypeDefinitionRegistry注解类不在测试类的包路径下,直接在测试类上用@Import引入:

@SpringBootTest
@Import(CustomTypeDefinitionRegistry.class) // 替换成你的TypeDefinitionRegistry类
public class DataFetcherRegistryTest {
    // ... 原有代码
}

2. 禁用默认schema文件加载

在测试资源目录下的application.properties(或application.yml)添加配置,让DGS找不到默认的schema文件,从而触发动态注册的Schema加载:

# 指向一个不存在的文件,强制DGS使用动态注册的Schema
dgs.graphql.schema-file=classpath:non-existent.graphql

或者用yml格式:

dgs:
  graphql:
    schema-file: classpath:non-existent.graphql

3. 校验动态Schema注册逻辑

确保@DgsTypeDefinitionRegistry的方法返回的TypeDefinitionRegistry正确定义了所需的类型和字段,比如:

@DgsTypeDefinitionRegistry
public class CustomTypeDefinitionRegistry {
    public TypeDefinitionRegistry registry() {
        TypeDefinitionRegistry registry = new TypeDefinitionRegistry();

        // 定义Query类型及catalog字段
        registry.add(GraphQLObjectType.newObject()
                .name("Query")
                .field(f -> f.name("catalog").type(GraphQLTypeReference.typeRef("Catalog")))
                .build());

        // 定义Catalog类型及customer字段
        registry.add(GraphQLObjectType.newObject()
                .name("Catalog")
                .field(f -> f.name("customer").type(GraphQLTypeReference.typeRef("Customer")))
                .build());

        // 定义Customer类型及test_attribute字段
        registry.add(GraphQLObjectType.newObject()
                .name("Customer")
                .field(f -> f.name("test_attribute").type(Scalars.GraphQLString))
                .build());

        return registry;
    }
}

4. 确认DataFetcher绑定正确

@DgsCodeRegistry的DataFetcher要和动态定义的字段完全匹配,比如:

@DgsCodeRegistry
public class CustomDataFetcherRegistry {
    public void registerDataFetchers(DataFetcherRegistry registry) {
        // 绑定Query.catalog的DataFetcher
        registry.registerDataFetcher("Query", "catalog", environment -> {
            // 返回模拟的Catalog数据
            Map<String, Object> customer = new HashMap<>();
            customer.put("test_attribute", "test-value");
            Map<String, Object> catalog = new HashMap<>();
            catalog.put("customer", customer);
            return catalog;
        });
    }
}

做完以上步骤后,重新运行测试,应该就能正确加载动态Schema并执行查询了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 06:30:11