Graphql-java-tools: нулевой параметр против отсутствующего параметра

Как я могу отличить в 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
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
635
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я нашел ответ. Если кому-то это нужно: Экземпляр 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

Другие вопросы по теме