我正在尋找使用另一種對象類型將字段值傳遞給已解析的字段。Java GraphQL - 將字段值傳遞給對象的解析器
如果我有`客戶>用戶>配置文件',另一種方法 - 如何將客戶中的CustomerID字段值傳遞給配置文件作爲參數或變量以正確解析?
我正在尋找使用另一種對象類型將字段值傳遞給已解析的字段。Java GraphQL - 將字段值傳遞給對象的解析器
如果我有`客戶>用戶>配置文件',另一種方法 - 如何將客戶中的CustomerID字段值傳遞給配置文件作爲參數或變量以正確解析?
有完全的3種可能性,以提供信息,以在任何級別的分解(DataFetcher
):
1)直接轉給查詢(可能在多個層次上):
{customer(id: 3) {
user {
profile(id: 3) {
name
}
}
}
}
2)從源獲得值對象
酸ce是封閉查詢的結果。 就你而言,customer
查詢的來源是根上下文(無論你在查詢執行時提供了什麼,例如graphQL.execute(query, rootContext)
)。
user
查詢的來源是任何customer
查詢返回的,推測是一些Customer
實例。
profile
查詢的來源是user
查詢返回的任何內容,推測是User
實例。 您可以通過DataFetchingEnvironment#getSource()
獲得源代碼。因此,如果User
包含CustomerID
,那麼只需通過((User) env.getSource()).getCustomerId()
即可獲得。如果不是,請考慮將結果包裝到一個對象中,該對象將包含子查詢中所需的全部內容。
3)圍繞使用根上下文
通行證值可以例如使用一個ConcurrentHashMap
作爲根上下文:graphQL.execute(query, new ConcurrentHashMap<String, Object>())
)。然後,DataFetcher
爲customer
內,您存儲CustomerID
進去:
Customer customer = getCustomer();
((Map<String, Object>) env.getContext()).put("CustomerID", customer.getId());
後來,DataFetcher
爲profile
裏面,可以從上下文獲得它:
((Map<String, Object>) env.getContext()).get("CustomerID");
取而代之的是ConcurrentHashMap
,你可以使用一個類型化的對象,但你必須確保這些字段是volatile
或獲取者/設置者或其他線程安全的。
最後一種方式是有狀態的,因此最難管理,因此只有在其他方式都失敗時才使用它。
NOTE:在graphql-java的下一個破解版本中,根據參考實現,根上下文對源代碼的行爲會稍微改變,所以答案會有些不同。在此處查看詳細信息https://github.com/graphql-java/graphql-java/pull/456
沒有任何代碼或其他關於您正在使用的信息。我沒有使用Java的任何GraphQL庫,所以YMMV,但通常你會將這些信息附加到你爲每個分辨率點返回的值。當你從'Customer'得到一個'User'時,它應該攜帶一些(或所有)來自'Customer'的數據,同樣也會攜帶'Profile',所以(天真地)你可能會做一些'((Profile)resolveParams。的getSource())。的getUser()。GETCUSTOMER()。的getId()' –