在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中添加指令作为模式中的定义。
我通过推特联系了Tejas Shikhare(https://twitter.com/tejas26),他很好地回答了我代码的问题:
有两种方法可以解决问题:
>
将请求中传递的查询更改为下面,这是如果您想捕获Train详细信息上的指令:
query($trainId: String!){train详细信息(trainId:$trainId)@引用{trainState}}
在GraphQLConfig类中添加trainStatus的dataFetcher,详见链接:https://www.graphql-java.com/documentation/v11/schema/这是如果您想捕获TrainStatus上的指令
我已经尝试了这两种解决方案,它的工作!