GraphQl SPQR (GraphQL Schema Publisher & Query Resolver ، وضوحا مثل مكبر الصوت ) هي مكتبة بسيطة للاستخدام للتطوير السريع من واجهات برمجة تطبيقات GraphQL في Java.
يهدف GraphQl SPQR إلى جعل الأمر بسيطًا لإضافة واجهة برمجة تطبيقات GraphQL إلى أي مشروع Java. إنه يعمل عن طريق إنشاء مخطط GraphQL ديناميكيًا من رمز Java.
عند تطوير التطبيقات التي تدعم GraphQL ، من الشائع تحديد المخطط أولاً وتوصيل منطق العمل لاحقًا. هذا هو المعروف باسم النمط الأول للمخطط. في حين أن لديها مزاياها ، بلغات مكتوبة بقوة وثابتة ، مثل جافا ، فإنها تؤدي إلى الكثير من الازدواجية.
على سبيل المثال ، يمكن أن يعجب تعريف مخطط نوع GraphQL البسيط:
type Link {
id : ID !
url : String !
description : String
}
وعادة ما يكون هناك نوع جافا المقابل في النظام ، على غرار ما يلي:
public class Link {
private final String id ;
private final String url ;
private final String description ;
//constructors, getters and setters
//...
}
كل من هذه الكتل تحتوي على نفس المعلومات بالضبط. والأسوأ من ذلك ، أن تغيير المرء يتطلب تغييرًا فوريًا على الآخر. هذا يجعل إعادة الطرد المحفوفة بالمخاطر والمرهقة ، ولا يمكن للمترجم المساعدة. من ناحية أخرى ، إذا كنت تحاول تقديم واجهة برمجة تطبيقات 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 >
Gradle
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. لا يزال المشروع صغيراً للغاية ، ولكنه يعمل بالفعل.
شاهد أمثلة أكثر اكتمالا باستخدام SPRING BOOT على https://github.com/leangen/graphql-spqr-samples
قريباً
للحصول على أفضل توافق ، هناك حاجة إلى Kotlin 1.3.70 أو في وقت لاحق مع الوسيطة المترجم -Xemit-jvm-type-annotations
. هذا يرشد برنامج التحويل البرمجي Kotlin لإنتاج التعليقات التوضيحية لاستخدام النوع (تم تقديمه في JDK8) بشكل صحيح. انظر KT-35843 و KT-13228 للحصول على التفاصيل.
هناك خطأ في محلل شرح OpenJDK قبل الإصدار 16 B17 الذي يتسبب في تكرار التعليقات التوضيحية على معلمات النوع العام. قد تواجه هذا في شكل غامض
AnnotationFormatError: Duplicate annotation for class: interface io.leangen.graphql.annotations.GraphQLNonNull
يتم إلقاؤها عند استخدام @GraphQLNonNull
على حد سواء على نوع وعلى معلماته العامة @GraphQLNonNull List<@GraphQLNonNull Item>
.
لحسن الحظ ، يبدو أن قلة قليلة من المستخدمين يواجهون هذه المشكلة ، حتى على JDKs المتأثرة. لاحظ أنه من المناسب فقط أي Java يجمع المصادر ، وليس أي Java تدير الرمز. لاحظ أيضًا أن Intellij Idea تأتي مجمعة مع JDK من تلقاء نفسها ، لذلك قد يؤدي بناء المشروع في الفكرة إلى هذا الخطأ. يجب عليك تكوين IDE لاستخدام نظام Java إذا كان مختلفًا.