Несоответствие имени поля SpringBoot GraphQL

Кажется, что имена, определенные в файле .graphqls, ДОЛЖНЫ соответствовать именам полей в POJO. Есть ли способ аннотировать поле, чтобы они не делали этого?

Например, у меня в файле graphqls есть что-то подобное

type Person {
     personId: ID!
     name: String!
}

Тогда в моем Entity POJO мне нравится

@Id
@Column(name = "PERSON_ID")
@JsonProperty("person_id")
private int personId;

@Column(name = "NAME")
@JsonProperty("name")
private String name;

Итак, намерение состоит в том, чтобы имя поля было personId, а база данных сохраняла его как столбец с именем PERSON_ID и чтобы он был сериализован как JSON и GraphQL как person_id.

Но graphql говорит на языке схемы. Таким образом, он сериализует его как personId, который соответствует полю схемы, но не является намерением. Я мог бы изменить схему на person_id, но тогда мне нужно также изменить поле ... Это еще не конец света, но иметь такие названия полей довольно "не-javalike".

Я использую эту библиотеку:

compile group: 'com.graphql-java', name: 'graphql-spring-boot-starter', version: '5.0.2'

Я также видел аннотацию @GraphQLName в библиотеке аннотаций, но мне, должно быть, чего-то не хватает, потому что она не выполняет то, что я ожидаю, или, возможно, я использую ее неправильно.

Есть ли способ обойти это или мне просто изменить имена?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
0
0
583
1

Ответы 1

GraphQL Java по умолчанию использует PropertyDataFetcher для разрешения значений полей (см. раздел получения данных в документации). Этот сборщик данных работает нестандартно, когда объект данных, возвращаемый сборщиком данных поля верхнего уровня, содержит дочерние поля, которые соответствуют именам свойств объекта данных.

Однако вы можете определить собственный сборщик данных для любого поля и использовать любое нужное вам правило.

Итак, если вам нужна схема, которая выглядит так

type Person {
     person_id: ID!
     name: String!
}

и ваша сущность вот так:

class Person {
    private int personId;

    private String name;

    // getters and setters
}

Вы можете написать простой пользовательский сборщик данных для поля personId

private RuntimeWiring buildWiring() {
    return RuntimeWiring.newRuntimeWiring()
            // query root data fetchers wiring
            .type(newTypeWiring("Person")
                    .dataFetcher("person_id", environment -> {
                        Person person = environment.getSource();
                        return person.getPersonId();
                    })
            )
            // maybe other wirings
            .build();
}

Это глупо. Вам не понадобится дюжина строк кода для каждого поля, для которого вы хотите явно указать имя. Джексон понимает это правильно, JPA и т.д ... Почему GraphQL борется?

MichaelB 08.08.2019 01:25

Вы также можете создать новый POJO, соответствующий схеме, и преобразовать ваши данные в этот POJO в основном сборщике данных.

felipe_gdr 09.08.2019 07:36

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