You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 23:27:33