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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 15:35:23