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

Java Spring GraphQL:@SchemaMapping如何获取@QueryMapping的OrderFilter参数?

解决方案

在Spring GraphQL中,@SchemaMapping标注的字段解析器无法直接通过@Argument获取顶层Query的参数,因为两者处于不同的解析上下文。以下是几种可行的实现方式:

方法一:通过DataFetchingEnvironment获取顶层参数

直接在cards方法中注入DataFetchingEnvironment,从环境中提取顶层Query的orderFilter参数:

@SchemaMapping
public List<Card> cards(Order order, DataFetchingEnvironment env) {
    // 提取顶层查询的orderFilter参数
    OrderFilter orderFilter = env.getArgument("orderFilter");
    // 根据order和orderFilter过滤卡片
    return this.cardService.getCards(order, orderFilter);
}

注意:如果查询时未传入orderFilter,env.getArgument()会返回null,需要根据业务逻辑做判空处理。

方法二:将参数关联到Order对象中

给Order类添加一个临时字段存储orderFilter(如果是JPA实体,可加@Transient避免持久化),在查询Orders时将参数注入到每个Order实例:

  1. 修改Order类:
public class Order {
    private String id;
    @Transient // 若为JPA实体,添加此注解避免持久化
    private OrderFilter orderFilter;

    // getter和setter方法
}
  1. 更新getOrders方法:
@QueryMapping
public List<Order> getOrders(@Argument OrderFilter orderFilter) {
    List<Order> orders = this.orderService.get(orderFilter);
    // 将orderFilter注入每个Order实例
    orders.forEach(order -> order.setOrderFilter(orderFilter));
    return orders;
}
  1. 在cards方法中直接从Order对象获取参数:
@SchemaMapping
public List<Card> cards(Order order) {
    OrderFilter orderFilter = order.getOrderFilter();
    return this.cardService.getCards(order, orderFilter);
}

方法三:通过GraphQL上下文传递参数

将orderFilter存入请求级别的GraphQL上下文,在cards方法中从上下文提取:

  1. 更新getOrders方法:
@QueryMapping
public List<Order> getOrders(@Argument OrderFilter orderFilter, DataFetchingEnvironment env) {
    // 将参数存入上下文
    env.getGraphQlContext().put("orderFilter", orderFilter);
    return this.orderService.get(orderFilter);
}
  1. 在cards方法中获取上下文参数:
@SchemaMapping
public List<Card> cards(Order order, DataFetchingEnvironment env) {
    OrderFilter orderFilter = env.getGraphQlContext().get("orderFilter");
    return this.cardService.getCards(order, orderFilter);
}

这种方式适合跨多个字段解析器共享参数的场景,但需注意上下文是请求全局的,避免参数冲突。

内容的提问来源于stack exchange,提问作者Macus Georgiev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 09:00:57