GraphQL SPQR (Penerbit & Resolver Query GraphQL, diucapkan seperti speaker ) adalah perpustakaan yang mudah digunakan untuk pengembangan cepat API GraphQL di Java.
GraphQL SPQR bertujuan untuk membuatnya mati mudah untuk menambahkan GraphQL API ke proyek Java apa pun . Ini bekerja dengan secara dinamis menghasilkan skema graphQL dari Java Code.
Saat mengembangkan aplikasi yang mendukung GraphQL, adalah umum untuk mendefinisikan skema terlebih dahulu dan menghubungkan logika bisnis nanti. Ini dikenal sebagai gaya skema-pertama. Meskipun memiliki kelebihan, dalam bahasa yang diketik secara statis dan statis, seperti Java, itu mengarah ke banyak duplikasi.
Misalnya, definisi skema tipe graphql sederhana bisa seperti ini:
type Link {
id : ID !
url : String !
description : String
}
Dan, umumnya, tipe Java yang sesuai akan ada dalam sistem, mirip dengan yang berikut:
public class Link {
private final String id ;
private final String url ;
private final String description ;
//constructors, getters and setters
//...
}
Kedua blok ini berisi informasi yang sama persis. Lebih buruk lagi, mengubah satu membutuhkan perubahan langsung ke yang lain. Ini membuat refactoring berisiko dan rumit, dan kompiler tidak dapat membantu. Di sisi lain, jika Anda mencoba memperkenalkan API GraphQL ke dalam proyek yang ada, menulis skema secara praktis berarti menggambarkan ulang seluruh model yang ada. Ini mahal dan rentan kesalahan, dan masih menderita duplikasi dan kurangnya perkakas.
Sebaliknya, GraphQL SPQR mengambil pendekatan kode-pertama, dengan menghasilkan skema dari model yang ada. Ini membuat skema dan model sinkronisasi, meredakan refactoring. Ini juga bekerja dengan baik dalam proyek -proyek di mana GraphQL diperkenalkan di atas basis kode yang ada.
Perhatikan bahwa pengembangan dalam gaya kode-pertama masih secara efektif skema-pertama, perbedaannya adalah Anda mengembangkan skema Anda tidak dalam bahasa lain, tetapi di Java, dengan IDE Anda, kompiler dan semua alat Anda membantu Anda. Memecahkan perubahan pada skema berarti kompilasi akan gagal. Tidak perlu untuk linter atau peretasan rapuh lainnya.
GraphQL SPQR digunakan ke Maven Central.
Maven
< dependency >
< groupId >io.leangen.graphql</ groupId >
< artifactId >spqr</ artifactId >
< version >0.12.3</ version >
</ dependency >
Lulusan
compile ' io.leangen.graphql:spqr:0.12.3 '
Contohnya akan menggunakan anotasi yang disediakan oleh GraphQL SPQR sendiri, tetapi ini opsional dan pemetaan sepenuhnya dapat dikonfigurasi, memungkinkan layanan yang ada diekspos melalui GraphQL tanpa modifikasi.
Kelas Layanan:
class UserService {
@ GraphQLQuery ( name = "user" )
public User getById ( @ GraphQLArgument ( name = "id" ) Integer id ) {
...
}
}
Jika Anda ingin melewatkan menambahkan @GraphQLArgument
, kompilasi dengan opsi -parameters
atau namanya akan hilang.
Kelas Domain:
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 ;
}
}
Untuk melampirkan bidang tambahan ke jenis User
graphQL, tanpa memodifikasi kelas User
, Anda cukup menambahkan kueri yang memiliki User
sebagai konteks . Cara paling sederhana adalah menggunakan anotasi @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 ) {
...
}
}
Mengekspos Layanan dengan 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
}
}}" );
Kami sedang mengerjakan starter boot musim semi bertenaga SPQR. Proyek ini masih sangat muda, tetapi sudah fungsional.
Lihat lebih banyak contoh lengkap menggunakan boot musim semi di https://github.com/leanggen/graphql-pqr-samples
Segera hadir
Untuk kompatibilitas terbaik, Kotlin 1.3.70 atau lebih baru diperlukan dengan argumen kompiler -Xemit-jvm-type-annotations
. Ini menginstruksikan kompiler Kotlin untuk menghasilkan anotasi jenis penggunaan (diperkenalkan dalam JDK8) dengan benar. Lihat KT-35843 dan KT-13228 untuk detailnya.
Ada bug di parser anotasi OpenJDK sebelum versi 16 B17 yang menyebabkan anotasi pada parameter tipe generik digandakan. Anda mungkin mengalami ini dalam bentuk misterius
AnnotationFormatError: Duplicate annotation for class: interface io.leangen.graphql.annotations.GraphQLNonNull
dilemparkan saat menggunakan @GraphQLNonNull
baik pada jenis dan pada parameter generik misalnya @GraphQLNonNull List<@GraphQLNonNull Item>
.
Untungnya, sangat sedikit pengguna yang tampaknya mengalami masalah ini, bahkan pada JDK yang terpengaruh. Perhatikan itu hanya relevan mana Java mengkompilasi sumber, bukan Java yang menjalankan kode. Perhatikan juga bahwa ide Intellij datang dibundel dengan JDK sendiri, jadi membangun proyek dalam ide dapat menyebabkan kesalahan ini. Anda harus mengkonfigurasi IDE Anda untuk menggunakan sistem java jika berbeda.