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

Java中GraphQL如何通过DataFetchingEnvironment从子数据获取器设置父类型字段

在Java GraphQL中从子数据获取器设置父级errors字段的实现

要实现从child字段的数据获取器中设置ParentType的errors字段,你可以利用DataFetchingEnvironment传递共享的错误状态,核心思路是通过引用传递的可变对象在父级和子级数据获取器间共享错误信息,具体步骤如下:

1. 定义可变错误载体类

因为Java的基本类型是值传递,需要一个可变的容器类来存储错误信息,让子级数据获取器可以修改父级的错误状态:

public class MutableError {
    private String type;
    private String name;

    // Getter和Setter方法
    public String getType() { return type; }
    public void setType(String type) { this.type = type; }
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
}

2. 初始化错误载体并传递

你有两种传递错误载体的方式:

方式一:通过父实体对象传递

在someQuery的数据获取器中,将MutableError作为ParentType的一个属性初始化:

// ParentType实体类
public class ParentType {
    private String name;
    private MutableError mutableError = new MutableError();
    private ChildType child;

    // Getter和Setter方法
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public MutableError getMutableError() { return mutableError; }
    public ChildType getChild() { return child; }
    public void setChild(ChildType child) { this.child = child; }
}

// someQuery的数据获取器
DataFetcher<ParentType> someQueryFetcher = environment -> {
    ParentType parent = new ParentType();
    parent.setName("Sample Parent");
    return parent;
};

方式二:通过请求上下文传递

如果不想修改ParentType实体类,可以将错误载体放入DataFetchingEnvironment的上下文(每个请求独立,线程安全):

// 初始化GraphQL时配置上下文工厂,确保每个请求有独立的上下文
GraphQL graphQL = GraphQL.newGraphQL(schema)
        .contextSupplier(() -> new HashMap<>())
        .build();

// someQuery的数据获取器
DataFetcher<ParentType> someQueryFetcher = environment -> {
    ParentType parent = new ParentType();
    parent.setName("Sample Parent");
    // 将错误载体放入上下文
    environment.getContext().put("parentError", new MutableError());
    return parent;
};

3. 在子字段数据获取器中设置错误

在child字段的数据获取器中,通过DataFetchingEnvironment获取错误载体并设置错误信息:

对应方式一的实现

DataFetcher<ChildType> childFetcher = environment -> {
    // 获取父级ParentType对象
    ParentType parent = environment.getSource();
    ChildType child = new ChildType();
    
    try {
        // 模拟子数据获取失败的场景
        throw new RuntimeException("Failed to fetch child data");
    } catch (Exception e) {
        // 设置父级的错误信息
        parent.getMutableError().setType("CHILD_FETCH_FAILURE");
        parent.getMutableError().setName(e.getMessage());
    }
    
    child.setName("Sample Child");
    return child;
};

对应方式二的实现

DataFetcher<ChildType> childFetcher = environment -> {
    // 从上下文获取错误载体
    MutableError mutableError = (MutableError) environment.getContext().get("parentError");
    ChildType child = new ChildType();
    
    try {
        throw new RuntimeException("Failed to fetch child data");
    } catch (Exception e) {
        mutableError.setType("CHILD_FETCH_FAILURE");
        mutableError.setName(e.getMessage());
    }
    
    child.setName("Sample Child");
    return child;
};

4. 实现errors字段的数据获取器

最后,在errors字段的数据获取器中读取错误载体的内容,转换为GraphQL定义的Error类型返回:

对应方式一的实现

// 假设Error是GraphQL对应的DTO类
public class Error {
    private String type;
    private String name;

    // Getter和Setter方法
    public String getType() { return type; }
    public void setType(String type) { this.type = type; }
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
}

// errors字段的数据获取器
DataFetcher<Error> errorsFetcher = environment -> {
    ParentType parent = environment.getSource();
    MutableError mutableError = parent.getMutableError();
    
    // 若无错误则返回null
    if (mutableError.getType() == null) {
        return null;
    }
    
    Error error = new Error();
    error.setType(mutableError.getType());
    error.setName(mutableError.getName());
    return error;
};

对应方式二的实现

DataFetcher<Error> errorsFetcher = environment -> {
    MutableError mutableError = (MutableError) environment.getContext().get("parentError");
    
    if (mutableError.getType() == null) {
        return null;
    }
    
    Error error = new Error();
    error.setType(mutableError.getType());
    error.setName(mutableError.getName());
    return error;
};

内容的提问来源于stack exchange,提问作者likhita avl

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 10:26:27