提问者:小点点

带有Java/Springboot的GraphQL无法从传递的查询中选择模式中定义为onField的自定义指令


在schema中的指令. graph ql文件中定义了自定义指令:

directive @reference on FIELD

在我的GraphQLConfig.java类中也传递了. graph ql文件:

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

root. graph ql如下:

schema{ query: Query}
type Query{ trainDetails( trainId: String!): TrainDetail}

train-详细信息. graph ql如下:

type TrainDetail{ trainId: String trainStatus: String}

在向springboot graph qlAPI传递的请求中,我想检查是否传递了指令@引用,然后在代码中执行一些业务逻辑。在Java服务器启动期间生成的模式中存在指令,但当我从请求中传递的查询中提取指令时,它不存在。

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

http://localhost:8080/graphql

GraphQL查询:

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

查询变量:

{ "trainId": "123456"}

dataFecther(也已添加到graph ql config类中),其中检查传递请求中的指令:

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

getTrain详细信息方法:

public TrainDetails getTrainDetails(DataFectchingEnvironment environment){ if(environment.getQueryDirectives().getImmediateDirective("reference").isEmpty()){//perform some logic}}    

if检查始终返回false,即使在请求查询中以指令形式传递@引用也是如此。它无法识别查询中已在FIELD上传递了指令。

请注意,这是指令On FIELD而不是FIELD DEFINITION,因此没有在train-详细信息. graph ql中添加指令作为模式中的定义。


共1个答案

匿名用户

我通过推特联系了Tejas Shikhare(https://twitter.com/tejas26),他很好地回答了我代码的问题:

  1. getQueryDirective. getImmediateDirective在字段train详细信息而不是trainStatus上运行。
  2. Datafetcher在特定字段上实现。
  3. 一种访问选择字段中的查询指令的方法,但您可以做的是为选择字段trainStatus实现自己的属性数据获取器,并从DataFetching环境访问那里的指令。
  4. 更多关于房产数据的信息请点击这里:https://www.graphql-java.com/documentation/v11/schema/

有两种方法可以解决问题:

>

  • 将请求中传递的查询更改为下面,这是如果您想捕获Train详细信息上的指令:

    query($trainId: String!){train详细信息(trainId:$trainId)@引用{trainState}}

    在GraphQLConfig类中添加trainStatus的dataFetcher,详见链接:https://www.graphql-java.com/documentation/v11/schema/这是如果您想捕获TrainStatus上的指令

    我已经尝试了这两种解决方案,它的工作!