Кажется, что имена, определенные в файле .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 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();
}
Вы также можете создать новый POJO, соответствующий схеме, и преобразовать ваши данные в этот POJO в основном сборщике данных.
Это глупо. Вам не понадобится дюжина строк кода для каждого поля, для которого вы хотите явно указать имя. Джексон понимает это правильно, JPA и т.д ... Почему GraphQL борется?