GraphQL SPQR (GraphQL Schema Publisher & Query Resolver, ออกเสียงเหมือน ลำโพง ) เป็นไลบรารีที่ใช้งานง่ายสำหรับการพัฒนาอย่างรวดเร็วของ GraphQL APIs ใน Java
GraphQL SPQR มีจุดมุ่งหมายเพื่อให้ตายง่ายในการเพิ่ม graphQL API ในโครงการ Java ใด ๆ มันทำงานโดยการสร้าง schema graphQL แบบไดนามิกจากรหัส Java
เมื่อพัฒนาแอปพลิเคชันที่เปิดใช้งาน 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 ที่ด้านบนของ codebase ที่มีอยู่
โปรดทราบว่าการพัฒนาในรูปแบบรหัสแรกยังคงเป็นสคีมาเป็นครั้งแรกอย่างมีประสิทธิภาพความแตกต่างคือคุณพัฒนาสคีมาของคุณไม่ได้อยู่ในภาษาอื่น แต่ใน 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 ;
}
}
ในการแนบฟิลด์เพิ่มเติมเข้ากับประเภท GraphQL User
โดยไม่ต้องแก้ไขคลาส 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>
โชคดีที่ผู้ใช้น้อยมากดูเหมือนจะประสบปัญหานี้แม้กระทั่งกับ JDK ที่ได้รับผลกระทบ โปรดทราบว่ามันมีความเกี่ยวข้องเท่านั้นที่ Java รวบรวม แหล่งที่มาไม่ใช่ Java ที่เรียกใช้ รหัส โปรดทราบด้วยว่าความคิด Intellij มาพร้อมกับ JDK ของตัวเองดังนั้นการสร้างโครงการในแนวคิดอาจนำไปสู่ข้อผิดพลาดนี้ คุณควรกำหนดค่า IDE ของคุณให้ใช้ Java ระบบหากแตกต่างกัน