Federation
Spring for GraphQL provides an integration for the federation-jvm library, which uses GraphQL Java to initialize the schema of a sub-graph within a graph of federated services. See Apollo Federation and the Subgraph specification for details.
Config
To enable the integration, declare a FederationSchemaFactory
bean in your config, and plug
it into GraphQlSource.Builder
. For example, with Spring Boot:
@Configuration
public class FederationConfig {
@Bean
public GraphQlSourceBuilderCustomizer customizer(FederationSchemaFactory factory) {
return builder -> builder.schemaFactory(factory::createGraphQLSchema);
}
@Bean
public FederationSchemaFactory schemaFactory() {
return new FederationSchemaFactory();
}
}
Now the schema for the sub-graph service can extend federated types:
type Book @key(fields: "id") @extends {
id: ID! @external
author: Author
}
type Author {
id: ID
firstName: String
lastName: String
}
@EntityMapping
An @EntityMapping
method can load federated type instances in response to an
_entities query
from the federation gateway. For example:
For example:
@Controller
private static class BookController {
@EntityMapping
public Book book(@Argument int id) { (1)
// ...
}
@SchemaMapping
public Author author(Book book) { (2)
// ...
}
}
1 | The @Argument method parameter is resolved from the "representation" input map for
the entity. The full "representation" input Map can also be resolved. See
Method Signature for supported
method argument and return value types. |
2 | @SchemaMapping methods can be used for the rest of the graph. |
An @EntityMapping
method can batch load federated entities of a given type. To do that,
declare the @Argument
method parameter as a list, and return the corresponding entity
instances as a list in the same order.
For example:
@Controller
private static class BookController {
@EntityMapping
public List<Book> book(@Argument List<Integer> idList) { (1)
// ... return books in the same order
}
@BatchMapping
public Map<Book, Author> author(List<Book> books) { (2)
// ...
}
}
1 | The idList naming convention helps to de-pluralize the parameter name in order to
look up the correct value in the "representation" input map. You can also set the
argument name through the annotation. |
2 | @BatchMapping methods can be used for the rest of the graph. |
Method Signature
Entity mapping methods support the following arguments:
Method Argument | Description |
---|---|
|
For access to a named value from the "representation" input map, also converted to typed Object. |
|
The full "representation" input map for the entity. |
|
The list of "representation" input maps when using a single controller method to load all entities of a given type. |
|
For access to an attribute from the main |
|
For access to an attribute from the local |
|
For access to the context from the |
|
Obtained from the Spring Security context, if available. |
|
For access to |
|
For access to the selection set for the query through the |
|
For access to the |
|
For direct access to the underlying |
@EntityMapping
methods can return Mono
, CompletableFuture
, Callable
, or the actual entity.