Foire Aux Questions

Réponses aux questions les plus fréquemment posées sur GraphQL AutoGen.


Toutes
Général
Configuration
Performance
Dépannage
Sécurité
Qu'est-ce que 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.

GraphQL AutoGen est-il adapté aux projets en production ?

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.

Comment configurer GraphQL AutoGen dans un projet Spring Boot existant ?

L'intégration de GraphQL AutoGen dans un projet Spring Boot existant est simple :

  1. Ajoutez la dépendance Maven/Gradle
  2. Annotez vos entités JPA avec @GraphQLType
  3. Annotez vos méthodes de contrôleur avec @GraphQLQuery, @GraphQLMutation, etc.
  4. Exécutez votre application

Consultez le guide de démarrage rapide pour des instructions détaillées.

Comment personnaliser les noms des types et champs GraphQL ?

Vous pouvez personnaliser les noms des types et champs GraphQL en utilisant les annotations :

Exemple
@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;

    // ...
}
Comment GraphQL AutoGen gère-t-il le problème des requêtes N+1 ?

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 :

  • Pour les relations @OneToOne et @ManyToOne, il crée des DataLoaders qui regroupent les requêtes pour les entités associées.
  • Pour les relations @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 :

Exemple
@ManyToOne
@GraphQLField
@GraphQLDataLoader(batchSize = 100)
private Category category;

Consultez le guide d'optimisation des performances pour plus de détails.

Comment implémenter la pagination avec GraphQL AutoGen ?

GraphQL AutoGen supporte deux types de pagination :

1. Pagination offset-based avec Spring Data

Pagination simple
@GraphQLQuery
public Page getProducts(
        @GraphQLArgument int page,
        @GraphQLArgument int size) {
    return productRepository.findAll(PageRequest.of(page, size));
}

2. Pagination cursor-based (style Relay)

Pagination Relay
@GraphQLQuery
public Connection getProductsConnection(
        @GraphQLArgument int first,
        @GraphQLArgument String after) {
    // Implémentation avec ConnectionFactory
}
J'obtiens une erreur "Type already defined". Comment résoudre ce problème ?

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 :

  1. Utilisez l'attribut name de l'annotation @GraphQLType pour attribuer un nom unique à chaque type :
Solution
// 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 :

application.properties
graphql.autogen.use-package-namespaces=true

Pour plus d'informations, consultez le guide de résolution des conflits de types.

Comment sécuriser mon API GraphQL avec Spring Security ?

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

Exemple
@GraphQLQuery
@PreAuthorize("hasRole('ADMIN')")
public List getAllUsers() {
    return userRepository.findAll();
}

2. Sécurisation au niveau de l'endpoint

Configuration
@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();
    }
}
Comment limiter la profondeur des requêtes GraphQL pour prévenir les attaques DoS ?

Vous pouvez configurer des limites pour les requêtes GraphQL afin de prévenir les attaques par déni de service :

application.properties
# 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é :

Validateur personnalisé
@Component
public class CustomQueryValidator implements Instrumentation {
    // Implémentation personnalisée
}