Strawberry Shake代码生成报错无法解析'None:Any'类型引用
Strawberry Shake 生成代码报「Unable to resolve type reference 'None:Any'」解决方案
问题复现场景
- 按照Strawberry Shake官方文档流程创建客户端演示项目,执行初始化命令成功拉取目标GraphQL服务的schema:
dotnet graphql init https://parseapi.back4app.com/graphql -n TestClient -p ./ConsoleApp1 --headers X-Parse-Application-Id=XXXXXXXXXXXXXXXXX --headers X-Parse-Master-Key=XXXXXXXXXXXXXXXXX --headers X-Parse-Client-Key= XXXXXXXXXXXXXXXXX --headers Content-Type=application/json
- 添加简单查询文件后生成解决方案,固定抛出以下错误,代码生成流程中断:
"Unable to resolve type reference 'None:Any'."
- 交叉验证结果:使用的查询语句在通用GraphQL调试工具中可正常执行;切换对接其他GraphQL服务端时,Strawberry Shake可正常完成代码生成;手动删除本地schema中所有
Any类型相关配置行后,项目可正常编译。
问题根因
该错误由schema中的未映射自定义标量导致:本次对接的Back4App服务输出的GraphQL schema中,包含用于表示动态JSON值的自定义标量Any,该标量不属于GraphQL规范内置的标准标量类型,Strawberry Shake默认没有配置该类型的序列化、映射规则,解析schema时无法识别对应类型引用,最终抛出解析失败错误。手动删除schema中Any相关配置仅为临时规避方案,后续查询涉及动态JSON字段时会出现类型生成异常,不建议长期使用。
标准处理方案
- 安装依赖包
在客户端项目中安装Strawberry Shake序列化相关依赖,内置的JSON序列化器可直接适配Any类型的动态值场景:dotnet add package StrawberryShake.Serialization - 显式注册
Any标量映射
打开项目中自动生成的依赖注入配置文件,在客户端构建逻辑中添加Any标量的绑定规则,将其映射到内置的JSON序列化器:services .AddTestClient() // 注册Any标量绑定 .AddScalarType<JsonScalar, JsonSerializer>("Any") .ConfigureHttpClient(client => { client.BaseAddress = new Uri("https://parseapi.back4app.com/graphql"); // 原有请求头配置保持不变 }); - 刷新schema重新生成代码
执行命令更新本地schema缓存,重新编译项目即可正常完成代码生成:dotnet graphql update dotnet build
如果不想引入额外序列化依赖,也可以直接在项目根目录的.graphqlrc.json配置文件中添加标量映射规则,将Any标量直接映射为.NET内置的System.Text.Json.JsonElement类型,无需手动修改本地schema文件。
内容的提问来源于stack exchange,提问作者Evi
相关产品推荐
相关产品推荐

