
Have It Your Way With MicroProfile GraphQL
A MicroProfile GraphQL application should have at least one root-level query and/or mutation. To create a query or mutation, you start with a public Java class annotated with @GraphQLApi
. Then you add public methods that are annotated with @Query
or @Mutation
for query or mutation, respectively. The query/mutation methods must always return a non-void type. These methods can return simple types like String
, int
, double
, boolean
, etc. which will be mapped to GraphQL scalars such as String
, Int
, Float
, Boolean
, etc. Alternatively, these methods could return custom Java types – the types would be mapped to GraphQL types and defined in the generated schema. For more details, see the MicroProfile GraphQL 1.0.2 API Docs.
For example, in the sample application, the currentConditions
query method returns a type called Conditions
– that type has properties such as temperatureF
, temperatureC
, precipitationType
, weatherText
, etc. The following schema is generated from the query and its return value:
The currentConditions
query has an argument, called location
. In the Java code, the argument is represented by a method parameter. Like output types, arguments/parameters can be simple Java types (mapping to GraphQL scalars) or custom types, which would be mapped to input types in the generated schema.
When mapping custom types, it is possible to change the name used in the schema by using the @Name
annotation. For example, if we wanted to change the schema to display tempInFahrenheit
instead of temperatureF
, we could just add @Name("tempInFahrenheit")
to the temperatureF
field in the Conditions
class.
If your application uses JSON-B, then @JsonbProperty
, @JsonbDateFormat
, and @JsonbNumberFormat
annotations can be used instead of @Name
, @DateFormat
or @NumberFormat
. When both sets of annotations are used, the annotations from the MicroProfile GraphQL APIs take precedence over the JSON-B APIs when used for schema generation or query/mutation execution.
Another useful annotation is @Source
. This annotation can be used to add a field to an entity object that might be expensive to look up or calculate, and so you might not want to spend the resources on the server side to compute that field when the client doesn’t want it anyway. Here’s an example from the sample:
This example is a little contrived, but it shows us that the wetBulbTempF
field will only be computed if the client requests that field. This method is in a class annotated with @GraphQLApi
(in this example, WeatherService
) and it contains a parameter annotated with @Source
that takes the entity object, Conditions
. When a client issues a query or mutation that would return the Conditions
entity, and that query/mutation specifies the wetBulbTempF
field, the wetBulbTempF(Conditions conditions)
method is invoked by the GraphQL implementation, passing in the Conditions
object that was returned from the query/mutation method.
Credit: Source link