GraphQL SPQR (GraphQL Schema Publisher & Resolver Reolver, произносится как динамик )-это простой в использовании библиотеку для быстрой разработки API GraphQL в Java.
GraphQL SPQR стремится сделать его мертвым, чтобы добавить API GraphQL в любой проект Java. Он работает, динамически генерируя схему GraphQL из кода Java.
При разработке приложений с поддержкой Graphq Это известно как стиль схемы. Хотя он имеет свои преимущества, на сильно и статически напечатанных языках, таких как Java, это приводит к большому дублированию.
Например, определение схемы простого типа GraphQL может понравиться это:
type Link {
id : ID !
url : String !
description : String
}
и, как правило, соответствующий тип Java будет существовать в системе, аналогично следующему:
public class Link {
private final String id ;
private final String url ;
private final String description ;
//constructors, getters and setters
//...
}
Оба эти блока содержат одну и ту же информацию. Хуже того, изменение одного требует немедленного изменения для другого. Это делает рефакторинг рискованного и громоздкого, и компилятор не может помочь. С другой стороны, если вы пытаетесь представить API GraphQL в существующий проект, написание схемы практически означает перепись всей существующей модели. Это и дорого, и склонно к ошибкам, и все еще страдает от дублирования и отсутствия инструментов.
Вместо этого GraphQL SPQR использует подход «Код-первый», генерируя схему из существующей модели. Это держит схему и модель в синхронизации, смягчая рефакторинг. Он также хорошо работает в проектах, где GraphQL вводится поверх существующей кодовой базы.
Обратите внимание, что развитие в стиле кода, первого стиля, по-прежнему эффективно схема, отличается, разница в том, что вы разрабатываете свою схему не на еще одном языке, а в Java, с вашей IDE, компилятором и всеми вашими инструментами, помогающими вам. Разрыв изменения в схеме означает, что компиляция потерпит неудачу. Нет необходимости в линтерах или других хрупких хаке.
GraphQL SPQR развернута в Maven Central.
Мавен
< dependency >
< groupId >io.leangen.graphql</ groupId >
< artifactId >spqr</ artifactId >
< version >0.12.3</ version >
</ dependency >
Градл
compile ' io.leangen.graphql:spqr:0.12.3 '
В примере будут использоваться аннотации, предоставленные самим GraphQL SPQR, но они необязательны, а отображение полностью настраивается, что позволяет выявлять существующие службы через GraphQL без модификации.
Класс обслуживания:
class UserService {
@ GraphQLQuery ( name = "user" )
public User getById ( @ GraphQLArgument ( name = "id" ) Integer id ) {
...
}
}
Если вы хотите пропустить добавление @GraphQLArgument
, компиляция с опцией -parameters
или имена будут потеряны.
Домен класс:
public class User {
private String name ;
private Integer id ;
private Date registrationDate ;
@ GraphQLQuery ( name = "name" , description = "A person's name" )
public String getName () {
return name ;
}
@ GraphQLQuery
public Integer getId () {
return id ;
}
@ GraphQLQuery ( name = "regDate" , description = "Date of registration" )
public Date getRegistrationDate () {
return registrationDate ;
}
}
Чтобы прикрепить дополнительные поля к типу User
GraphQL, без изменения класса User
, вы просто добавляете запрос, который имеет User
в качестве контекста . Самый простой способ - использовать аннотацию @GraphQLContext
:
class UserService {
... //regular queries, as above
// Attach a new field called twitterProfile to the User GraphQL type
@ GraphQLQuery
public TwitterProfile twitterProfile ( @ GraphQLContext User user ) {
...
}
}
Разоблачение сервиса с помощью GraphQL-SPQR:
UserService userService = new UserService (); //instantiate the service (or inject by Spring or another framework)
GraphQLSchema schema = new GraphQLSchemaGenerator ()
. withBasePackages ( "io.leangen" ) //not mandatory but strongly recommended to set your "root" packages
. withOperationsFromSingleton ( userService ) //register the service
. generate (); //done ;)
GraphQL graphQL = new GraphQL . Builder ( schema )
. build ();
//keep the reference to GraphQL instance and execute queries against it.
//this operation selects a user by ID and requests name, regDate and twitterProfile fields only
ExecutionResult result = graphQL . execute (
"{ user (id: 123) {
name,
regDate,
twitterProfile {
handle
numberOfTweets
}
}}" );
Мы работаем над стартером SPQR SPQR Spring Boot. Проект все еще очень молод, но уже функциональный.
См. Более полные примеры с использованием Spring Boot на https://github.com/leangen/graphql-pqr-samples
Вскоре
Для наилучшей совместимости Kotlin 1.3.70 или более поздней -Xemit-jvm-type-annotations
. Это инструктирует компилятор Kotlin для правильного производства аннотаций типового использования (в JDK8). См. CT-35843 и KT-13228 для деталей.
В анализаторе аннотации OpenJDK есть ошибка, которая до версии 16 B17 , которая вызывает дублирование аннотаций на параметрах общего типа. Вы можете испытать это в форме таинственного
AnnotationFormatError: Duplicate annotation for class: interface io.leangen.graphql.annotations.GraphQLNonNull
бросается при использовании @GraphQLNonNull
как на типе, так и по его общим параметрам eg @GraphQLNonNull List<@GraphQLNonNull Item>
.
К счастью, очень немногие пользователи, кажется, испытывают эту проблему, даже на пораженных JDK. Обратите внимание, что актуально только то, что Java собирает источники, а не Java запускает код. Также обратите внимание, что Intellij Idea поставляется в комплекте с собственным JDK, поэтому создание проекта в идее может привести к этой ошибке. Вы должны настроить свою IDE на использование системы Java, если она отличается.