Hot Chocolate框架无法为Input类型字段设置默认值如何解决
问题原因
这个报错是因为.NET 原生的[DefaultValue]特性在被GraphQL框架(通常为Hot Chocolate)序列化时,不会自动将C# 枚举值转换为GraphQL SDL要求的大写枚举名称,生成的SDL默认值会保留C# 侧的命名格式,导致Altair解析SDL时格式不匹配。
解决方案
你可以通过以下两种配置方式得到预期的SDL结构:
方案1:全局配置枚举命名规则+使用GraphQL专属默认值特性
- 首先在服务注册时配置全局枚举命名规则,确保枚举值序列化后为大写格式:
builder.Services.AddGraphQLServer() // 配置全局枚举默认使用大写命名约定 .ModifyOptions(opt => opt.DefaultEnumNamingConvention = EnumNamingConvention.UpperCase);
- 将输入类的
[DefaultValue]替换为Hot Chocolate提供的[GraphQLDefaultValue]特性:
using HotChocolate; public class PostPhotoInput { [GraphQLDefaultValue(PhotoCategory.Portrait)] public PhotoCategory Category { get; set; } }
方案2:显式定义输入对象类型配置
如果你不想修改原有输入类的特性,也可以通过自定义输入类型配置的方式指定默认值:
using HotChocolate.Types; public class PostPhotoInputType : InputObjectType<PostPhotoInput> { protected override void Configure(IInputObjectTypeDescriptor<PostPhotoInput> descriptor) { descriptor.Field(f => f.Category) .DefaultValue(PhotoCategory.Portrait); } }
配置完成后重新启动服务,生成的SDL就会符合预期格式,Altair重载文档时不会再抛出解析错误。
内容的提问来源于stack exchange,提问作者Anthony Bias
相关产品推荐
相关产品推荐

