Java Spring Boot Apollo Federation引用解析器问题排查
问题解决:Apollo联邦中Person服务_Entities返回null的修复
核心问题分析
你的Person服务配置里,fetchEntities和resolveEntityType方法都直接返回null,导致网关请求实体时无法正确查询Person数据,也无法识别实体类型,最终返回[null]。
正确实现步骤
1. 完善fetchEntities方法
该方法需要根据传入的representations(包含__typename和id),从数据源(数据库、内存存储等)中查询对应的Person实体。
2. 完善resolveEntityType方法
该方法需要根据实体对象,返回对应的GraphQLObjectType,明确告诉GraphQL系统当前实体的类型。
完整配置代码示例
假设你有PersonRepository用于获取Person数据:
import graphql.schema.GraphQLObjectType; import graphql.schema.GraphQLSchema; import graphql.schema.idl.SchemaParser; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import com.apollographql.federation.graphqljava.Federation; import com.apollographql.federation.graphqljava._Entity; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @Configuration public class GraphQLConfig { private final PersonRepository personRepository; // 构造注入PersonRepository public GraphQLConfig(PersonRepository personRepository) { this.personRepository = personRepository; } @Bean public GraphQLSchema customSchema(SchemaParser schemaParser) { return Federation.transform(schemaParser.makeExecutableSchema()) .fetchEntities(env -> { // 获取网关传入的representations列表 List<Map<String, Object>> representations = env.getArgument(_Entity.argumentName); // 遍历查询对应Person实体 return representations.stream() .map(rep -> { String typename = (String) rep.get("__typename"); if ("Person".equals(typename)) { String personId = (String) rep.get("id"); return personRepository.findById(personId).orElse(null); } return null; }) .collect(Collectors.toList()); }) .resolveEntityType(env -> { // 根据实体对象匹配GraphQL类型 Object entity = env.getObject(); if (entity instanceof Person) { return env.getSchema().getObjectType("Person"); } return null; }) .build(); } }
关键细节说明
fetchEntities中判断__typename是为了后续扩展其他实体类型时的可维护性,当前仅处理Person类型即可。- 确保
PersonRepository.findById能正确返回包含id和name字段的Person对象。 resolveEntityType需准确匹配实体类与Schema中定义的类型名称(这里Person类对应Schema里的Person类型)。
验证修复
重启Person服务后,网关转发的_entities查询将返回正确结果:
{ "data": { "_entities": [ { "name": "id为2的Person对应名称" } ] } }
内容的提问来源于stack exchange,提问作者Doron Solomon
相关产品推荐
相关产品推荐

