Réponses aux questions les plus fréquemment posées sur GraphQL AutoGen.
GraphQL AutoGen est une bibliothèque pour Spring Boot qui génère automatiquement une API GraphQL complète à partir de vos entités JPA et contrôleurs Spring, sans avoir à écrire manuellement des schémas GraphQL ou des resolvers complexes.
Il réduit considérablement le code boilerplate nécessaire pour créer une API GraphQL et s'intègre parfaitement avec l'écosystème Spring.
Oui, GraphQL AutoGen est conçu pour être utilisé dans des environnements de production. La version 1.0.0 est une version stable qui a été testée sur des applications réelles à grande échelle.
Il inclut des fonctionnalités importantes comme la gestion automatique des requêtes N+1, la pagination, la mise en cache, et s'intègre avec Spring Security pour l'autorisation.
L'intégration de GraphQL AutoGen dans un projet Spring Boot existant est simple :
@GraphQLType
@GraphQLQuery
, @GraphQLMutation
, etc.Consultez le guide de démarrage rapide pour des instructions détaillées.
Vous pouvez personnaliser les noms des types et champs GraphQL en utilisant les annotations :
@Entity
@GraphQLType(name = "Produit", description = "Un produit dans le catalogue")
public class Product {
@Id
private Long id;
@GraphQLField(name = "nom", description = "Nom du produit")
private String name;
// ...
}
GraphQL AutoGen résout automatiquement le problème des requêtes N+1 en générant des DataLoaders pour les relations entre entités JPA :
@OneToOne
et @ManyToOne
, il crée des DataLoaders qui regroupent les requêtes pour les entités associées.@OneToMany
et @ManyToMany
, il crée des DataLoaders qui chargent efficacement les collections.Vous pouvez également personnaliser le comportement des DataLoaders avec l'annotation @GraphQLDataLoader
:
@ManyToOne
@GraphQLField
@GraphQLDataLoader(batchSize = 100)
private Category category;
Consultez le guide d'optimisation des performances pour plus de détails.
GraphQL AutoGen supporte deux types de pagination :
1. Pagination offset-based avec Spring Data
@GraphQLQuery
public Page getProducts(
@GraphQLArgument int page,
@GraphQLArgument int size) {
return productRepository.findAll(PageRequest.of(page, size));
}
2. Pagination cursor-based (style Relay)
@GraphQLQuery
public Connection getProductsConnection(
@GraphQLArgument int first,
@GraphQLArgument String after) {
// Implémentation avec ConnectionFactory
}
Cette erreur se produit lorsque deux ou plusieurs classes Java tentent de générer des types GraphQL avec le même nom. Pour résoudre ce problème :
name
de l'annotation @GraphQLType
pour attribuer un nom unique à chaque type :// Dans un package
@GraphQLType(name = "AdminUser")
public class User { ... }
// Dans un autre package
@GraphQLType(name = "CustomerUser")
public class User { ... }
Ou activez les espaces de noms basés sur les packages :
graphql.autogen.use-package-namespaces=true
Pour plus d'informations, consultez le guide de résolution des conflits de types.
GraphQL AutoGen s'intègre parfaitement avec Spring Security. Vous pouvez sécuriser votre API GraphQL de plusieurs façons :
1. Sécurisation au niveau des méthodes
@GraphQLQuery
@PreAuthorize("hasRole('ADMIN')")
public List getAllUsers() {
return userRepository.findAll();
}
2. Sécurisation au niveau de l'endpoint
@Configuration
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
return http
.authorizeHttpRequests(auth -> {
auth.requestMatchers("/graphql").authenticated();
auth.requestMatchers("/graphiql").hasRole("ADMIN");
})
.oauth2ResourceServer(OAuth2ResourceServerConfigurer::jwt)
.build();
}
}
Vous pouvez configurer des limites pour les requêtes GraphQL afin de prévenir les attaques par déni de service :
# Limiter la profondeur des requêtes
graphql.autogen.max-query-depth=10
# Limiter la complexité des requêtes
graphql.autogen.max-query-complexity=100
# Limiter la taille des requêtes
spring.graphql.graphiql.enabled=true
spring.graphql.websocket.connection-init-timeout=60s
Vous pouvez également implémenter un validateur personnalisé :
@Component
public class CustomQueryValidator implements Instrumentation {
// Implémentation personnalisée
}