GraphQL Schemagen生成Schema未含废弃原因引发ESLint报错
GraphQL Schema生成时@deprecated未携带废弃原因触发ESLint报错
问题场景
用Gradle运行schemagen生成.graphqls和.json Schema文件,Java代码里已经给字段指定了废弃原因,但生成的Schema中@deprecated指令没带上这个原因,触发ESLint规则报错:
ESLint: Directive "@deprecated" must have a reason! (@graphql-eslint/require-deprecation-reason)
相关Java代码
final GraphQLFieldDefinition oldField = field( newFieldDefinition() .name( "oldField" ) .description( "an old field" ) .type( GraphQLDate ) .deprecate( "deprecated, use newField" ) .build() ); type( ModelBuilder.fromTransferable( "Example", "Example Description", Example.class ) .field( oldField ) .field( "newField", "newField Description", GraphQLDate ) .buildObject() );
当前生成的schema.graphqls
"Example Description" type Example { "an old field" oldField: ISO8601Date @deprecated "newField Description" newField: ISO8601Date }
期望的正确输出
"Example Description" type Example { "an old field" oldField: ISO8601Date @deprecated(reason: "deprecated, use newField") "newField Description" newField: ISO8601Date }
解决办法
- 升级GraphQL依赖:老版本的GraphQL Java库可能不支持将废弃原因写入
@deprecated的参数中,升级到支持该特性的版本(例如GraphQL Java 11及以上)。 - 修改废弃指令的写法:部分库的
deprecate(String)方法仅标记字段废弃,不会把字符串转为reason参数,改用标准的指令添加方式:final GraphQLFieldDefinition oldField = field( newFieldDefinition() .name( "oldField" ) .description( "an old field" ) .type( GraphQLDate ) .withDirective(Directives.deprecated("deprecated, use newField")) .build() ); - 检查Gradle插件配置:如果使用第三方schemagen插件,查看插件文档确认是否有控制废弃原因输出的配置项,确保该功能已启用。
内容的提问来源于stack exchange,提问作者Tom Delebo
相关产品推荐
相关产品推荐

