Как я могу отличить в java graphQL, если для параметра было явно установлено значение null, или если он не был предоставлен вообще?
Пример использования, которого я пытаюсь достичь, заключается в следующем: у меня есть такая мутация
updateUser(id:Int!, changes:UserChanges!)
#where UserChanges is defined as:
type UserChanges {
login:String
email:String
#etc
}
Идея здесь в том, что пользователь предоставляет только те поля, которые он хочет изменить (например, реагировать на setState). Поэтому, если адрес электронной почты опущен, я хочу оставить его без изменений.
Но что, если он / она хочет явно установить для электронной почты значение null? Есть ли способ выяснить это с помощью моего метода распознавания и действовать соответственно?
(Я использую библиотеку graphql-java-tools)




Я нашел ответ. Если кому-то это нужно: Экземпляр graphql.schema.DataFetchingEnvironment доступен каждому методу преобразователя.
Это предоставляет такие методы, как getArguments (), hasArgument () и т. д. Используя эти методы, мы можем узнать, был ли аргумент явно установлен в значение null или не был предоставлен вообще.
Похоже, что десериализация из запроса / переменных выполняется Fastxml Джексоном, и это подходящее место для решения проблемы, иначе это становится слишком сложным: проверить каждое поле? вложенный?
Итак: UserChanges.java должен выглядеть так:
class UserChanges {
// SHOULD NOT HAVE ALL ARGUMENT CONSTRUCTOR!
Optional<String> login;
Optional<String> email;
... getters & setters
}
в этом случае десериализатор будет использовать сеттеры ТОЛЬКО ДЛЯ ПРЕДОСТАВЛЕННЫХ ПОЛЕЙ!
И {"login":null} станет:
UserChanges.login = Optional.empty
UserChanges.email = null