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
相关产品推荐
相关产品推荐

