GraphQL SPQR(GraphQL Schema Publisher&Query Resolver、 Speakerのように発音)は、JavaのGraphQL APIの迅速な開発のための使いやすいライブラリです。
GraphQL SPQRは、GraphQL APIをJavaプロジェクトに簡単に追加できるようにすることを目指しています。 JavaコードからGraphQLスキーマを動的に生成することで機能します。
GraphQL対応アプリケーションを開発する場合、最初にスキーマを定義し、後でビジネスロジックを接続することが一般的です。これはスキーマファーストスタイルとして知られています。それはその利点がありますが、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
//...
}
これらのブロックには、まったく同じ情報が含まれています。さらに悪いことに、一方を変更するには、他方に即座に変更が必要です。これにより、リファクタリングが危険で面倒になり、コンパイラは役に立ちません。一方、GraphQL APIを既存のプロジェクトに導入しようとしている場合、スキーマを作成することは、実際に既存のモデル全体を再記述することを意味します。これは高価であり、エラーが発生しやすいものであり、依然として複製とツールの欠如に苦しんでいます。
代わりに、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
クラスを変更せずにUser
GraphQLタイプに追加のフィールドを添付するには、 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駆動のスプリングブートスターターに取り組んでいます。このプロジェクトはまだ非常に若いですが、すでに機能しています。
https://github.com/leangen/graphql-spqr-samplesでスプリングブートを使用した詳細な例をご覧ください
近日公開
最適な互換性のために、コンパイラ引数-Xemit-jvm-type-annotations
では、Kotlin 1.3.70以降が必要です。これにより、Kotlinコンパイラに、型使用量の注釈(JDK8で導入)を正しく作成するよう指示します。詳細については、KT-35843およびKT-13228を参照してください。
Generic Typeパラメーターの注釈を重複させるバージョン16 B17の前に、OpenJDKの注釈パーサーにはバグがあります。あなたはこれを神秘的な形で経験するかもしれません
AnnotationFormatError: Duplicate annotation for class: interface io.leangen.graphql.annotations.GraphQLNonNull
タイプとその一般的なパラメーターの両方で@GraphQLNonNull
@GraphQLNonNull List<@GraphQLNonNull Item>
するときにスローされます。
幸いなことに、影響を受けたJDKでさえ、この問題を経験しているユーザーはほとんどいません。 Javaがソースをコンパイルするのは、Javaがコードを実行するものではなく、関連性があることに注意してください。また、Intellijのアイデアには独自のJDKがバンドルされているため、Ideaのプロジェクトを構築するとこのエラーが発生する可能性があります。システムが違う場合は、システムJavaを使用するようにIDEを構成する必要があります。