Netflix DGS EntityFetcher中LinkedHashMap转InnerResult类型转换异常
解决DGS EntityFetcher中LinkedHashMap转自定义实体类的ClassCastException问题
问题原因
在DGS联邦架构中,子图之间传递的@external标记的外部字段,默认会被反序列化为LinkedHashMap类型,而非你定义的InnerResult实体类。直接强转List<InnerResult>会触发ClassCastException。
解决方案
利用DGS框架提供的DgsTypeConverter工具,将LinkedHashMap列表转换为InnerResult实体类列表,具体步骤如下:
- 在EntityFetcher方法中注入
DgsTypeConverter - 从
values中取出原始的LinkedHashMap列表 - 使用
convertEach方法批量转换为目标实体类
修改后的代码示例
import com.netflix.graphql.dgs.DgsEntityFetcher; import com.netflix.graphql.dgs.DgsTypeConverter; import com.netflix.graphql.dgs.client.codegen.DataFetcherResult; import java.util.List; import java.util.LinkedHashMap; // 省略其他导入和类定义 @DgsEntityFetcher(name = DgsConstants.MYRESULT.TYPE_NAME) public DataFetcherResult<MyResult> getResults(Map<String, Object> values, DgsTypeConverter converter) { String id = (String) values.get("id"); // 取出原始的LinkedHashMap列表 List<LinkedHashMap<String, Object>> rawInnerResults = (List<LinkedHashMap<String, Object>>) values.get("innerResults"); // 转换为InnerResult实体类列表 List<InnerResult> innerResults = converter.convertEach(rawInnerResults, InnerResult.class); MyResult result = MyResult.newBuilder() .id(id) .innerResults(innerResults) .build(); return DataFetcherResult.<MyResult>newResult() .data(result) .build(); }
额外注意事项
- 确保
InnerResult类有无参构造器,或者使用Jackson注解(如@JsonCreator)标记带参构造器,以便框架能正确实例化对象。 - 如果子图返回的字段名与
InnerResult类的属性名不匹配,需用@JsonProperty注解指定映射关系,例如:public class InnerResult { @JsonProperty("subgraph_field_name") private String classNameField; // 省略getter、setter或Builder } - 验证子图返回的
innerResults结构与InnerResult类的字段完全匹配,避免因字段缺失或类型不匹配导致转换失败。
内容的提问来源于stack exchange,提问作者Gajukorse
相关产品推荐
相关产品推荐

