Quarkus+SmallRye GraphQL批量解析器错误处理实现方法咨询
在Quarkus+SmallRye GraphQL中实现带错误处理的批量解析器
核心思路
批量解析器不能直接通过抛出全局异常实现单字段错误(全局抛异常会导致整个请求数据丢失),但可以借助GraphQLContext为每个字段单独添加错误,同时在返回列表的对应位置返回null,以此复现非批量解析器的原有行为。
实现代码
import org.eclipse.microprofile.graphql.GraphQLContext; import org.eclipse.microprofile.graphql.GraphQLException; import java.util.ArrayList; import java.util.List; import java.util.Map; public List<Person> partner(@Source List<Person> persons, @Context GraphQLContext context) { // 1. 批量获取所有Person对应的Partner,建议用高效的批量查询(比如单次数据库查询) Map<Person, Person> partnerMap = service.getPartners(persons); List<Person> resultList = new ArrayList<>(persons.size()); // 2. 遍历每个Person,处理结果并绑定字段错误 for (int index = 0; index < persons.size(); index++) { Person person = persons.get(index); Person partner = partnerMap.get(person); if (partner == null) { // 构造对应Person的错误信息 GraphQLException error = new GraphQLException("No partner for person " + person.getName()); // 将错误关联到具体字段路径:allPersons[索引].partner context.addError(error, Path.fromList(List.of("allPersons", index, "partner"))); // 对应位置返回null resultList.add(null); } else { resultList.add(partner); } } return resultList; }
关键说明
- 错误绑定逻辑:通过
context.addError()将错误绑定到具体的字段路径,响应的errors数组会包含每个缺失Partner的错误信息,且精准对应到数据中的位置。 - 数据结构一致性:返回列表中,有Partner的位置返回实体对象,无Partner的位置返回
null,保证data部分的结构和非批量解析器完全一致。 - 批量查询优化:
service.getPartners(persons)需要实现为批量查询(比如一次性拉取所有目标Person的Partner),这也是使用批量解析器的核心目的——减少重复的数据库调用,提升性能。
关于“解析器无法同时返回错误与数据”的误区
这个说法针对的是直接在批量解析器中抛出全局异常的场景:此时整个请求的data会被置为null,所有错误都作为全局错误返回。但通过GraphQLContext添加字段级错误的方式,完全可以实现“部分数据正常返回,部分字段携带错误”的效果,和非批量解析器的行为完全匹配。
内容的提问来源于stack exchange,提问作者janbiko
相关产品推荐
相关产品推荐

