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实例:
- 修改Order类:
public class Order { private String id; @Transient // 若为JPA实体,添加此注解避免持久化 private OrderFilter orderFilter; // getter和setter方法 }
- 更新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; }
- 在cards方法中直接从Order对象获取参数:
@SchemaMapping public List<Card> cards(Order order) { OrderFilter orderFilter = order.getOrderFilter(); return this.cardService.getCards(order, orderFilter); }
方法三:通过GraphQL上下文传递参数
将orderFilter存入请求级别的GraphQL上下文,在cards方法中从上下文提取:
- 更新getOrders方法:
@QueryMapping public List<Order> getOrders(@Argument OrderFilter orderFilter, DataFetchingEnvironment env) { // 将参数存入上下文 env.getGraphQlContext().put("orderFilter", orderFilter); return this.orderService.get(orderFilter); }
- 在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
相关产品推荐
相关产品推荐

