GraphQL Mutation无法传递数据问题排查求助
问题分析与解决:GraphQL Mutation无法传递对象变量
问题核心原因
你的GraphQL Mutation定义明确要求传入**documentInput对象变量**,但测试代码错误地将对象的字段拆成id、name、desc三个独立变量传递,导致服务端找不到documentInput这个必填变量,直接判定其为Null,触发NonNull校验错误。即使移除Mutation里的NonNull约束,因为根本没传documentInput变量,服务端依然会认为它是Null,所以错误不会消失。
修复方案
需要将id、name、desc封装成一个对象,作为documentInput变量传入,以下是两种常用实现方式:
方式1:用Map快速构造输入对象(适合临时测试)
修改测试代码的变量传递逻辑,把字段打包进Map作为documentInput的值:
@Test public void shouldCreateDocument_andReturnIt() { // 构造DocumentInput对应的Map对象 Map<String, Object> documentInput = new HashMap<>(); documentInput.put("id", 0L); documentInput.put("name", "named"); documentInput.put("desc", "descd"); DocumentDto result = httpGraphQlTester.document(""" mutation createDocument($documentInput: DocumentInput!) { createDocument(documentInput: $documentInput) { id name desc } } """) .variable("documentInput", documentInput) // 传递封装好的对象变量 .execute() .path("data.createDocument") // 路径需精准指向返回的Document对象 .entity(DocumentDto.class) .get(); System.out.println(result); }
方式2:定义专门的Input类(规范开发做法)
创建与GraphQL DocumentInput类型对应的Java类:
public class DocumentInputDto { private Long id; private String name; private String desc; // 必须提供公共无参构造 public DocumentInputDto() {} // 全参构造(可选,方便初始化) public DocumentInputDto(Long id, String name, String desc) { this.id = id; this.name = name; this.desc = desc; } // 必须提供Getter方法,用于序列化映射 public Long getId() { return id; } public String getName() { return name; } public String getDesc() { return desc; } }
然后在测试代码中使用该类构造变量:
@Test public void shouldCreateDocument_andReturnIt() { DocumentInputDto documentInput = new DocumentInputDto(0L, "named", "descd"); DocumentDto result = httpGraphQlTester.document(""" mutation createDocument($documentInput: DocumentInput!) { createDocument(documentInput: $documentInput) { id name desc } } """) .variable("documentInput", documentInput) .execute() .path("data.createDocument") .entity(DocumentDto.class) .get(); System.out.println(result); }
额外注意事项
- 测试代码中的
path("data")需调整为path("data.createDocument"),因为返回的data对象里,createDocument字段才对应目标Document对象,直接用data会导致映射失败。 - 确保GraphQL的
DocumentInput类型确实包含id、name、desc三个字段,且字段名大小写与Java类完全匹配(GraphQL字段名大小写敏感)。
内容的提问来源于stack exchange,提问作者AndrasCsanyi
相关产品推荐
相关产品推荐

