GraphQL-API'er med Spring Boot · Lektion

Brugerdefineret fejlhåndtering i GraphQL

Implementér brugerdefineret exception-håndtering, og formatér fejlresponser i overensstemmelse med bedste praksis for GraphQL.

Lektion 1 af 412 trin

Brugerdefineret fejlhåndtering i GraphQL er en gratis GraphQL-API'er med Spring Boot-lektion på CoddyKit. Dette er lektion 1 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i GraphQL-API'er med Spring Boot, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. GraphQL-API'er med Spring Boot-kurset indeholder 4 lektioner i alt.

Forstå GraphQL-fejl

Når noget går galt i en GraphQL-operation, returnerer serveren typisk et errors-array i svaret. Dette array indeholder objekter, der beskriver, hvad der gik galt.

Som standard kan disse fejlmeddelelser være generiske eller endda afsløre følsomme interne oplysninger som stack traces, hvilket ikke er ideelt for produktions-API'er.

Spring GraphQL's standardadfærd

Spring GraphQL omsætter ofte Java-undtagelser som RuntimeException, der kastes af dine data fetchere, til en standardiseret DataFetchingException. Selvom det fungerer, giver denne standardadfærd måske ikke de specifikke, brugervenlige oplysninger, som dine klienter har brug for.

Hvorfor tilpasse fejlsvar?

Tilpasning af fejlhåndtering giver væsentlige fordele:

  • Forbedret brugeroplevelse: Giv slutbrugere tydelige meddelelser, der fortæller, hvad de kan gøre.
  • Øget sikkerhed: Undgå at afsløre følsomme interne oplysninger, f.eks. databasefejl og komplette stack traces.
  • Logik på klientsiden: Medtag tilpassede fejlkoder eller oplysninger, som frontend-applikationer kan bruge til at reagere specifikt på forskellige fejltyper.

Mød DataFetcherExceptionResolver

I Spring GraphQL er den primære måde at tilpasse fejlsvar på at implementere grænsefladen DataFetcherExceptionResolver. Denne effektive grænseflade gør det muligt at opfange enhver undtagelse, som en data fetcher kaster, og omdanne den til et struktureret GraphQLError-objekt.

Definer din egen fejl

Først opretter vi en simpel tilpasset undtagelse. Det hjælper med at kategorisere bestemte fejlscenarier i din applikation. For eksempel en ResourceNotFoundException:

public class ResourceNotFoundException extends RuntimeException {
  private final String resourceId;

  public ResourceNotFoundException(String message, String resourceId) {
    super(message);
    this.resourceId = resourceId;
  }

  public String getResourceId() {
    return resourceId;
  }
}

Byg din egen resolver

Nu opretter vi en klasse, der implementerer DataFetcherExceptionResolver. Denne klasse undersøger den kastede undtagelse og opbygger en tilpasset GraphQLError, eventuelt med specifikke oplysninger via extensions.

import graphql.GraphQLError;
import graphql.execution.DataFetcherExceptionHandler;
import graphql.execution.DataFetcherExceptionHandlerParameters;
import graphql.execution.DataFetcherExceptionHandlerResult;
import graphql.error.ErrorType;
import java.util.HashMap;
import java.util.Map;

public class CustomExceptionResolver implements DataFetcherExceptionHandler {
  @Override
  public DataFetcherExceptionHandlerResult onException(
      DataFetcherExceptionHandlerParameters handlerParameters) {
    Throwable exception = handlerParameters.getException();

    if (exception instanceof ResourceNotFoundException) {
      ResourceNotFoundException rnfEx = (ResourceNotFoundException) exception;
      Map<String, Object> extensions = new HashMap<>();
      extensions.put("errorCode", "NOT_FOUND");
      extensions.put("resourceId", rnfEx.getResourceId());

      GraphQLError error = GraphQLError.newError()
          .message(rnfEx.getMessage())
          .locations(handlerParameters.getSourceLocation())
          .path(handlerParameters.getPath())
          .extensions(extensions)
          .errorType(ErrorType.DataFetchingException)
          .build();

      return DataFetcherExceptionHandlerResult.newResult().error(error).build();
    }
    // Fallback for unhandled exceptions
    return DataFetcherExceptionHandlerResult.newResult()
        .error(GraphQLError.newError()
            .message("An unexpected error occurred.")
            .errorType(ErrorType.DataFetchingException)
            .build())
        .build();
  }
}

Aktivér din egen resolver

For at få Spring GraphQL til at bruge din CustomExceptionResolver skal du registrere den som en Spring-@Bean i din applikationskonfiguration. Det fortæller Spring, at den skal medtage resolveren i GraphQL-udførelseskæden.

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import graphql.execution.DataFetcherExceptionHandler;

@Configuration
public class GraphQLConfig {
  @Bean
  public DataFetcherExceptionHandler customDataFetcherExceptionHandler() {
    return new CustomExceptionResolver();
  }
}

Se det i praksis!

Lad os køre en forenklet Spring Boot-app. Hvis du forespørger på et element med et andet ID end '1', opfanger vores tilpassede fejlresolver DemoResourceNotFoundException og formaterer fejlsvaret med specifikke oplysninger i feltet extensions.

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import graphql.kickstart.tools.GraphQLQueryResolver;
import graphql.execution.DataFetcherExceptionHandler;
import graphql.execution.DataFetcherExceptionHandlerParameters;
import graphql.execution.DataFetcherExceptionHandlerResult;
import graphql.GraphQLError;
import graphql.error.ErrorType;
import java.util.HashMap;
import java.util.Map;

// Main Application Class
@SpringBootApplication
public class ErrorDemoApp {
  public static void main(String[] args) {
    SpringApplication.run(ErrorDemoApp.class, args);
  }

  @Bean
  public GraphQLQueryResolver queryResolver() {
    return new DemoQueryResolver();
  }

  @Bean
  public DataFetcherExceptionHandler customDataFetcherExceptionHandler() {
    return new CustomErrorResolver();
  }

  // Custom Exception
  static class DemoResourceNotFoundException extends RuntimeException {
    private final String resourceId;
    public DemoResourceNotFoundException(String msg, String id) {
      super(msg); this.resourceId = id;
    }
    public String getResourceId() { return resourceId; }
  }

  // Data Fetcher
  @Component
  static class DemoQueryResolver implements GraphQLQueryResolver {
    public String getItem(String id) {
      if ("1".equals(id)) {
        return "Item Found: " + id;
      }
      throw new DemoResourceNotFoundException("Item not found", id);
    }
  }

  // Custom Error Resolver
  @Component
  static class CustomErrorResolver implements DataFetcherExceptionHandler {
    @Override
    public DataFetcherExceptionHandlerResult onException(
        DataFetcherExceptionHandlerParameters params) {
      Throwable ex = params.getException();
      if (ex instanceof DemoResourceNotFoundException) {
        DemoResourceNotFoundException rnfEx = (DemoResourceNotFoundException) ex;
        Map<String, Object> ext = new HashMap<>();
        ext.put("code", "ITEM_NOT_FOUND");
        ext.put("itemId", rnfEx.getResourceId());
        GraphQLError error = GraphQLError.newError()
            .message(rnfEx.getMessage())
            .locations(params.getSourceLocation())
            .extensions(ext)
            .errorType(ErrorType.DataFetchingException)
            .build();
        return DataFetcherExceptionHandlerResult.newResult().error(error).build();
      }
      return DataFetcherExceptionHandlerResult.newResult()
          .error(GraphQLError.newError()
              .message("Unexpected error")
              .errorType(ErrorType.DataFetchingException)
              .build())
          .build();
    }
  }
}

Fejludvidelser til kontekst

Feltet extensions i et GraphQLError er en effektiv funktion. Det gør det muligt at medtage tilpassede, maskinlæsbare data som errorCode, resourceId eller valideringsfejl, som klienter kan bruge til avanceret fejlhåndteringslogik ud over den menneskeligt læsbare meddelelse.

Bedste praksis for fejl

Følg disse råd for at sikre robust fejlhåndtering i din GraphQL-API:

  • Vær specifik: Brug forskellige tilpassede undtagelser til forskellige fejltyper.
  • Skjul interne oplysninger: Afslør aldrig rå stack traces eller databasefejl i produktionsmiljøer.
  • Ensartet format: Sørg for, at dine tilpassede fejl altid følger en forudsigelig struktur.
  • Klientvenlighed: Giv tydelige meddelelser og handlingsrettede koder til frontend-logik.

Hurtigt tjek: Fejlhåndtering

Hvilken grænseflade bruges primært i Spring GraphQL til at tilpasse, hvordan Java-undtagelser omdannes til GraphQLError-objekter?

Opsummering: Tilpasset fejlhåndtering

Vi har lært, hvordan man kommer ud over GraphQL's standardfejlmeddelelser ved at implementere tilpasset undtagelseshåndtering i Spring Boot. Du kan oprette tilpassede undtagelser, bruge DataFetcherExceptionResolver til at opfange dem og formatere præcise GraphQLError-objekter med nyttige extensions. Det forbedrer API-sikkerheden, brugeroplevelsen og håndteringen af fejl på klientsiden.

Gratis at komme i gang

Lær GraphQL-API'er med Spring Boot med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
12
Lektioner
48

Ofte stillede spørgsmål

Er lektionen “Brugerdefineret fejlhåndtering i GraphQL” gratis?

Ja — hele teksten til “Brugerdefineret fejlhåndtering i GraphQL” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af GraphQL-API'er med Spring Boot-kurset, skal du opgradere til CoddyKit PRO. GraphQL-API'er med Spring Boot-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Brugerdefineret fejlhåndtering i GraphQL”?

Implementér brugerdefineret exception-håndtering, og formatér fejlresponser i overensstemmelse med bedste praksis for GraphQL. Du øver dig i GraphQL-API'er med Spring Boot med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på GraphQL-API'er med Spring Boot?

Der kræves ingen tidligere erfaring. GraphQL-API'er med Spring Boot på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 1 af 4.

Hvor lang tid tager lektionen “Brugerdefineret fejlhåndtering i GraphQL”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne GraphQL-API'er med Spring Boot-lektion?

Ja. Alle GraphQL-API'er med Spring Boot-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Brugerdefineret fejlhåndtering i GraphQL
  2. Godkendelse med Spring Security
  3. Autorisation med directives og kontekst
  4. Ratebegrænsning og beskyttelse mod query-dybde
← Tilbage til GraphQL-API'er med Spring Boot