GraphQL-Java is a great library, but its syntax is a little bit verbose. This library offers an annotations-based syntax for GraphQL schema definition.
(Gradle syntax)
dependencies {
compile "com.graphql-java:graphql-java-annotations:0.13.1"
}Any regular Java class can be converted to a GraphQL object type. Fields can
be defined with a @GraphQLField (see more on fields below) annotation:
public class SomeObject {
@GraphQLField
public String field;
}
// ...
GraphQLObjectType object = GraphQLAnnotations.object(SomeObject.class);This is very similar to defining objects:
public interface SomeInterface {
@GraphQLField
String field();
}
// ...
GraphQLInterfaceType object = GraphQLAnnotations.iface(SomeInterface.class);In addition to specifying a field over a Java class field, a field can be defined over a method:
public class SomeObject {
@GraphQLField
public String field() {
return "field";
}
}Or a method with arguments:
public class SomeObject {
@GraphQLField
public String field(String value) {
return value;
}
}Note: You need to use
-parametersjavac option to compile, which makes argument name as the default GraphQL name. Otherwise, you will need to add the@GraphQLName("value")annotation to specify one.
You can also inject DataFetchingEnvironment as an argument, at any position:
public class SomeObject {
@GraphQLField
public String field(DataFetchingEnvironment env, String value) {
return value;
}
}Additionally, @GraphQLName can be used to override field name. You can use @GraphQLDescription to set a description.
These can also be used for field parameters:
public String field(@GraphQLName("val") String value) {
return value;
}In addition, @GraphQLDefaultValue can be used to set a default value to a parameter. Due to limitations of annotations, the default valueu has to be provided by a class that implements Supplier<Object>:
public static class DefaultValue implements Supplier<Object> {
@Override
public Object get() {
return "default";
}
}
@GraphQLField
public String field(@GraphQLDefaultValue(DefaultValue.class) String value) {
return value;
}@GraphQLDeprecate and Java's @Deprecated can be used to specify a deprecated
field.
You can specify a custom data fetcher for a field with @GraphQLDataFetcher
By default, standard GraphQL types (String, Integer, Long, Float, Boolean, Enum, List) will be inferred from Java types. Also, it will respect @javax.validation.constraints.NotNull annotation with respect to value's nullability, as well as @GraphQLNonNull
Stream type is also supported and treated as a list.
If you want to register an additional type (for example, UUID), you have to create a new class implementing TypeFunction for it:
public class UUIDTypeFunction implements TypeFunction {
...
}And register it with GraphQLAnnotations:
GraphQLAnnotations.register(new UUIDTypeFunction())
// or if not using a static version of GraphQLAnnotations:
// new GraphQLAnnotations().registerType(new UUIDTypeFunction())You can also specify custom type function for any field with @GraphQLType annotation.
You can use @GraphQLRelayMutation annotation to make mutation adhere to
Relay specification for mutations
You can use @GraphQLConnection annotation to make a field iterable in adherence to Relay Connection specification.