Ce guide présente les options de configuration avancées de GraphQL AutoGen pour personnaliser complètement votre API GraphQL.
GraphQL AutoGen offre de nombreuses options de configuration via les propriétés Spring Boot dans votre fichier application.properties
ou application.yml
.
# Configuration globale
graphql.autogen.enabled=true
graphql.autogen.base-package=com.example
graphql.autogen.schema-name=MySchema
# Options de génération
graphql.autogen.include-nullability-info=true
graphql.autogen.add-introspection-fields=true
graphql.autogen.include-schema-definition=true
# Comportement des scanners
graphql.autogen.scan-entities=true
graphql.autogen.scan-controllers=true
graphql.autogen.scan-services=false
# DataLoaders
graphql.autogen.enable-dataloaders=true
graphql.autogen.dataloader-batch-size=100
graphql.autogen.dataloader-timeout=2000
Vous pouvez également utiliser la syntaxe YAML :
graphql:
autogen:
enabled: true
base-package: com.example
schema-name: MySchema
include-nullability-info: true
add-introspection-fields: true
include-schema-definition: true
scan-entities: true
scan-controllers: true
scan-services: false
enable-dataloaders: true
dataloader-batch-size: 100
dataloader-timeout: 2000
Pour une configuration plus avancée, vous pouvez créer un bean de configuration personnalisé :
@Configuration
public class GraphQLAutoGenConfig {
@Bean
public GraphQLAutoGenConfigurer graphqlAutoGenConfigurer() {
return new GraphQLAutoGenConfigurer()
.setBasePackage("com.example")
.setSchemaName("MySchema")
.setIncludeNullabilityInfo(true)
.setAddIntrospectionFields(true)
.setIncludeSchemaDefinition(true)
.setScanEntities(true)
.setScanControllers(true)
.setScanServices(false)
.setEnableDataLoaders(true)
.setDataLoaderBatchSize(100)
.setDataLoaderTimeout(Duration.ofMillis(2000));
}
}
Vous pouvez créer vos propres resolvers GraphQL :
@Component
public class ProductResolver implements GraphQLResolver {
private final CategoryRepository categoryRepository;
public ProductResolver(CategoryRepository categoryRepository) {
this.categoryRepository = categoryRepository;
}
@GraphQLField
public Category category(Product product, DataFetchingEnvironment env) {
// Logique personnalisée pour résoudre la catégorie d'un produit
return categoryRepository.findById(product.getCategoryId()).orElse(null);
}
}
Création d'un DataLoader personnalisé pour optimiser les requêtes :
@Component
public class CategoryBatchLoader implements BatchLoader {
private final CategoryRepository categoryRepository;
public CategoryBatchLoader(CategoryRepository categoryRepository) {
this.categoryRepository = categoryRepository;
}
@Override
public CompletionStage> load(List categoryIds) {
return CompletableFuture.supplyAsync(() -> {
List categories = categoryRepository.findAllById(categoryIds);
Map categoryMap = categories.stream()
.collect(Collectors.toMap(Category::getId, Function.identity()));
return categoryIds.stream()
.map(id -> categoryMap.getOrDefault(id, null))
.collect(Collectors.toList());
});
}
}
Configurer la sécurité pour vos requêtes GraphQL :
@Configuration
@EnableWebSecurity
public class GraphQLSecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
return http
.csrf(csrf -> csrf.disable())
.authorizeHttpRequests(auth -> {
auth.requestMatchers("/graphql").permitAll();
auth.requestMatchers("/graphiql").hasRole("ADMIN");
auth.anyRequest().authenticated();
})
.oauth2ResourceServer(OAuth2ResourceServerConfigurer::jwt)
.build();
}
@Bean
public GraphQLDirectiveWiringCustomizer directiveWiringCustomizer() {
return wiringCustomizer -> {
// Ajouter la directive @auth pour sécuriser les champs
wiringCustomizer.setDirectiveWiringFactory(new AuthDirectiveWiring());
};
}
}
Vous pouvez également personnaliser le moteur GraphQL sous-jacent :
@Configuration
public class CustomGraphQLEngineConfig {
@Bean
public GraphQL graphQL(GraphQLSchema schema) {
return GraphQL.newGraphQL(schema)
.queryExecutionStrategy(new AsyncExecutionStrategy())
.mutationExecutionStrategy(new AsyncSerialExecutionStrategy())
.subscriptionExecutionStrategy(new SubscriptionExecutionStrategy())
.instrumentation(new RequestLoggingInstrumentation())
.build();
}
@Bean
public GraphQLSchemaCustomizer schemaCustomizer() {
return schema -> {
// Personnaliser le schéma avant qu'il soit construit
return SchemaTransformer.transformSchema(schema);
};
}
}