#java #graphql #graphql-java
Вопрос:
В документе реализации Java GraphQL тип подключения выполняется, как показано ниже, который содержит один для human
запроса и один для friends
поля Human
типа, как выделено.
Мне интересно, какая польза от последнего, того, что для friends
поля Human
типа.
Я думаю, что мы уже возвращаем весь Human
объект, включая friends
поле , в проводке первого типа с использованием StarWarsData.getHumanDataFetcher()
, тогда зачем нам нужен последний?
Спасибо!
Схема выглядит следующим образом:
Ответ №1:
friends
Поле имеет тип Character[]
. Когда вы возвращаете определенный тип, поля , которые не имеют встроенного скалярного типа (например String
, который является встроенным Character
, а который нет), требуют для извлечения собственного средства выборки. Однако вы можете определить DTO, которое моделирует Human
тип, и smart graphql.schema.PropertyDataFetcher
, предоставляемый graphql-java, должен извлекать поля вашего POJO, поскольку он знает, как следовать шаблонам POJO на основе имени поля.
Комментарии:
1. Но не могу ли я просто вернуть весь
Human
объект, включаяfriends
использованиеStarWarsData.getHumanDataFetcher()
?2. Набор данных предоставляет данные для поля. Поэтому в каждом определении поля должен быть приемник данных. Если поле не содержит определенного набора данных, вместо него используется набор свойств.
Human
использует встроенные средства выборки дляID
,name
иhomePlanet
поскольку они имеют встроенные скалярные типы, но для них потребуются специальные средства выборкиfriends
, посколькуCharacter
не является одним из таких встроенных типов.3. Я искренне ценю ваш ответ, но я думаю, что на самом деле это не по делу. Если
StarWarsData.getHumanDataFetcher()
возвращает DTO , содержащий поле с именемfriends
, значение по умолчаниюPropertyDataFetcher
должно иметь возможность его извлечь, поэтому причиной для конкретного набора данных должно быть что-то другое.4. PropertyDataFetcher используется только в том случае, если нет конкретного сборщика данных, как я уже говорил в своем предыдущем комментарии. Я не думаю, что мы можем знать причину наличия определенного набора данных для
friends
в этом случае, не зная деталей реализации (возможноHuman
, у вас нет DTO, который правильно моделирует тип, и, следовательно, не будет работать PropertyDataFetcher?). Это может быть вопросом предпочтений разработчика, может быть вопросом конкретной потребности, которую покрывает пользовательский набор данных (но нам об этом не говорят), может быть просто выбором стиля для примера.5. Я думаю, что то, что я хотел бы узнать, — это рассуждения за полями. Ака, почему некоторые реализации предпочитают не включать
friends
поле в DTO и создавать отдельный набор данных? Я имею в виду, что если DTO охватывают все поля, мы используем только сборщики данных для запросов и мутаций, но не какие-либо поля, разве это не чище?