JraphQL
Java with GraphQL
Module | Description |
---|---|
jraphql-lang | GraphQL language representation |
jraphql-runtime | GraphQL execution engine |
jraphql-parser-antlr | Parser written in Antlr4 parse to jraphql-lang |
Get Started
- Maven me.wener.jraphql
<dependency>
<groupId>me.wener.jraphql</groupId>
<artifactId>jraphql-runtimer</artifactId>
<version>0.0.6</version>
</dependency>
<dependency>
<groupId>me.wener.jraphql</groupId>
<artifactId>jraphql-parser-antlr</artifactId>
<version>0.0.6</version>
</dependency>
Features
Language representation
Feature | Description |
---|---|
Serializable | can parse or stringify to or from JSON |
Immutable | friendly to cache or precompile |
Buildable | every type has a builder for it generated by lombok. |
Pluggable | language representation is not related to parser impl |
Syntax Extension
Add extend by name
syntax for object and interface
Weave multi schemas
# common.graphqls
scalar Version
# crm.graphqls
type CrmQuery {
customer(id:ID!):Customer
crmVersion: Version!
}
type CrmUser {
customers: [Customer]
}
extend type Query by CrmQuery
extend type User by CrmUser
# erp.graphqls
type ErpQuery {
product(id:ID!):Product
}
extend type Query by ErpQuery
Conditional schema
# Only admin can see and use these methods
type AdminMutation {
changePassword(id:ID,password:String): ChangePasswordPayload
}
extend type Mutation by AdminMutation @Role(role:"admin")
Allowed directives on directive definition, add DIRECTIVE location
directive @JavaType(type:String) on DIRECTIVE
directive @Auth(value:String) @JavaType(type:"Auth") on FIELD_DEFINITION;
Allowed schema has optional name
schema Test {
query: MyQuery
}
Runtime Extension
- Type implements interface don't need to write the fields again.
interface Node {
id: ID!
}
type User implements Node {
# id: ID! # This is optional
}
- Can disable introspection
new MetaResolver().setDisableIntrospection(true)
Embeddable Schema
JraphQL Runtime contain a embedded schema MetaSchema, generated by EmbededSchema.
- Parse Schema
- Serialize to JSON
- Best compress GZip
- Encode use mime base64
- Original JSON 32631 byte -> Encoded Base64 5352 byte
Example
StarWar
- StarWarApplication
- SpringBoot WebFlux based
- start and visite http://localhost:8080
- StarWarResolver
- resolve the StarWar schema.
Queries you can try
mutation addRev {
createReview(episode: EMPIRE, review: {stars: 4, commentary: "Ok Good"}) {
stars
commentary
}
}
query rev($e:Episode = EMPIRE) {
hero(episode: $e) {
id
name
appearsIn
}
reviews(episode: $e) {
stars
commentary
}
}
query search {
search(text: "o") {
__typename
... on Human {
id
name
}
... on Droid {
primaryFunction
}
... on Starship {
length
}
}
}
query baseQuery {
starship(id: "3000") {
id
name
length(unit: FOOT)
}
character(id: "2000") {
id
... on Human {
mass
starships {
name
}
}
... on Droid {
name
appearsIn
}
}
human(id: "1003") {
friendsConnection(after: "1002") {
friends {
name
}
pageInfo {
hasNextPage
startCursor
endCursor
}
}
friends {
name
}
}
}
Work with GoaphQL
GoaphQL can generate code from schema that depends on jrapgql-api, can directly run on jraphql-graphql-java-adapter.
The generated code is static type and full featured, everything is an interface.