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

GraphQL DGS框架启动时Data Loader类未注册问题求助

问题分析与解决方案

核心问题排查

你的ActorDataLoader未被正确注册,结合代码来看,主要有以下几个错误点:

1. DataLoader实现的类型不匹配

你的ActorDataLoader实现了MappedBatchLoader<String, Show>,但load方法的返回类型却是CompletionStage<Map<String, Listing>>——这里的Listing是拼写错误,应该改为Show,否则会导致类型不兼容,Spring无法正常识别并注册这个DataLoader Bean。

2. load方法返回null

load方法直接返回null,这不仅不符合CompletionStage的规范,还会导致后续调用抛出异常,必须返回一个有效的CompletionStage实例。

3. 潜在的包扫描问题

确保ActorDataLoader类所在的包被Spring Boot的组件扫描覆盖(即包含在@SpringBootApplication注解的scanBasePackages范围内,或者和启动类在同一/子包下),否则Spring无法发现这个Bean。

4. DataLoader获取方式的验证

虽然DGS支持通过类对象获取DataLoader,但如果类未被正确注册,就会返回null。先解决上述注册问题,再验证获取逻辑。

修正后的代码示例

修正后的ActorDataLoader

@DgsDataLoader(maxBatchSize = 1)
public class ActorDataLoader implements MappedBatchLoader<String, Show> {

    @Override
    public CompletionStage<Map<String, Show>> load(final Set<String> keys) {
        // 替换为实际批量查询逻辑,示例返回空Map避免NPE
        return CompletableFuture.completedFuture(Collections.emptyMap());
    }
}

修正后的ShowDataFetcher

@DgsComponent
public class ShowDataFetcher {

    @DgsQuery
    public ShowsByIdsOutput showsByIds(@InputArgument final ShowsByIdsInput input) {
        // 填充实际Show数据,否则env.getSource()会返回null
        List<Show> shows = input.getIds().stream()
                .map(id -> Show.newBuilder().id(id).build())
                .collect(Collectors.toList());
        return ShowsByIdsOutput.newBuilder().ids(shows).build();
    }

    @DgsData(parentType = "Show")
    public CompletableFuture<Actor> actors(final DgsDataFetchingEnvironment env) {
        final Show show = env.getSource();
        if (show == null) {
            return CompletableFuture.completedFuture(null); // 处理空源情况
        }

        // 通过类获取DataLoader,或使用名称"actorDataLoader"
        final DataLoader<String, Show> dataLoader = env.getDataLoader(ActorDataLoader.class);

        return dataLoader.load(show.getId())
                .thenApply(loadedShow -> {
                    // 原代码中show.getAtcors()是拼写错误,需改为show.getActors()
                    return loadedShow != null ? loadedShow.getActors() : null;
                });
    }
}

额外注意事项

  • 原代码中Show类的getAtcors()是拼写错误,需修正为getActors(),否则编译会报错。
  • ShowsByIdsOutput中的字段名ids语义不合理,建议改为shows,避免混淆。
  • showsByIds方法当前返回空的ShowsByIdsOutput,需要填充实际的Show数据,否则env.getSource()会返回null,导致后续逻辑报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 08:57:38