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

async-graphql中ObjectType trait绑定不满足的原因排查

Async-GraphQL 4.0.13 合并对象编译错误原因解析

你遇到的两个编译错误根源完全一致:调用Schema::build时传入了QueryRoot结构体的构造函数,而非它的实例。

错误细节拆解

1. E0277 未实现ObjectType trait

Schema::build的第一个参数要求传入实现了ObjectType trait的类型实例,但你传入的QueryRoot是结构体的构造函数(类型为fn(UserQuery, MovieQuery) -> QueryRoot),这个函数类型并没有实现ObjectType trait,因此触发该错误。

2. E0308 类型不匹配

你的返回类型定义为Schema<QueryRoot, EmptyMutation, EmptySubscription>,但传入构造函数后,实际构建出的是Schema<fn(UserQuery, MovieQuery) -> QueryRoot, ...>,两者类型不匹配,导致类型错误。

修复方案

因为QueryRoot派生了Default trait,直接传入它的默认实例即可。修改create_schema函数:

pub fn create_schema() -> GraphqlSchema {
    Schema::build(QueryRoot::default(), EmptyMutation, EmptySubscription)
        .extension(Tracing)
        .finish()
}

或者手动创建实例(效果一致):

pub fn create_schema() -> GraphqlSchema {
    Schema::build(QueryRoot(UserQuery::default(), MovieQuery::default()), EmptyMutation, EmptySubscription)
        .extension(Tracing)
        .finish()
}

原理说明

#[derive(MergedObject, Default)]会自动为QueryRoot生成Default实现,当你调用QueryRoot::default()时,会自动为内部的UserQuery和MovieQuery创建默认实例,最终生成的QueryRoot实例会自动实现ObjectType trait,完全满足Schema::build的参数要求。

内容的提问来源于stack exchange,提问作者Fred Hors

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 13:05:23