带有Java/Springboot的GraphQL无法从传递的查询中选取定义为架构中onField的自定义指令

带有Java/Springboot的GraphQL无法从传递的查询中选取定义为架构中onField的自定义指令,java,spring-boot,graphql,backend,graphql-java,Java,Spring Boot,Graphql,Backend,Graphql Java,在架构中的directives.graphql文件中定义了自定义指令: directive @reference on FIELD 还传递了GraphQLConfig.java类中的.graphql文件: private static final String[] SCHEMA_FILES = new String[]{"schema/root.graphql","schema/directives.graphql","schema/train

在架构中的directives.graphql文件中定义了自定义指令:

directive @reference on FIELD
还传递了GraphQLConfig.java类中的.graphql文件:

private static final String[] SCHEMA_FILES = new String[]{"schema/root.graphql","schema/directives.graphql","schema/train-details.graphql"};
root.graphql如下所示:

schema{ query: Query}
type Query{ trainDetails( trainId: String!): TrainDetail}
type TrainDetail{ trainId: String trainStatus: String}
train-details.graphql如下所示:

schema{ query: Query}
type Query{ trainDetails( trainId: String!): TrainDetail}
type TrainDetail{ trainId: String trainStatus: String}
在传递给springboot graphqlapi的请求中,我想检查是否传递了指令@reference,然后在代码中执行一些业务逻辑。在Java中的服务器启动期间生成的模式中存在该指令,但当我从请求中传递的查询中提取该指令时,该指令不存在

传入请求的查询,url(在本地启动服务器)

http://localhost:8080/graphql

GraphQL查询:

query($trainId: String!){trainDetails(trainId: $trainId){trainStatus @reference}}
查询变量:

{ "trainId": "123456"}
dataFecther(也已添加到graphql配置类中),其中检查传递的请求中的指令:

public DataFetcher getTrainDetailsDataFecther(){ return environment -> trainDetailsFetcher.getTrainDetails.getTrainDetails(environment);}
getTrainDetails方法:

public TrainDetails getTrainDetails(DataFectchingEnvironment environment){ if(environment.getQueryDirectives().getImmediateDirective("reference").isEmpty()){//perform some logic}}    
if检查总是返回false,即使@reference作为指令在请求查询中传递。它无法识别已在查询中的字段上传递了指令


请注意,这是关于字段的指令,而不是关于字段定义的指令,因此没有在train-details.graphql中添加该指令作为模式中的定义。

我通过Twitter联系了Tejas Shikhare(),他很友好地回答了我代码的问题:

  • getQueryDirectives.getImmediateDirective正在对字段trainDetails而不是trainStatus进行操作
  • Datafetcher是在特定字段上实现的
  • 访问选择字段中的查询指令的一种方法,但您可以为selectionField trainStatus实现自己的属性数据获取程序,并从DataFetchingEnvironment访问其中的查询指令
  • 有关属性数据获取的更多信息,请参见:
  • 有两种方法可以解决此问题:

  • 将请求中传递的查询更改为以下,如果您希望捕获有关TrainDetails的指令:

    查询($trainId:String!){trainDetails(trainId:$trainId)@reference{trainStatus}

  • 在GraphQLConfig类中添加trainStatus的dataFetcher,如链接中所述: 这是如果您想要捕获关于TrainStatus的指令

  • 我已经尝试了这两种解决方案,效果很好