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
相关产品推荐
相关产品推荐

