Spring Boot 4 -mikropalvelut ja REST-sovellusliittymät · Oppitunti

@ControllerAdvice ja @ExceptionHandler

Käsitelkää poikkeukset keskitetysti.

Oppitunti 3/413 vaihetta

@ControllerAdvice ja @ExceptionHandler on ilmainen Spring Boot 4 -mikropalvelut ja REST-sovellusliittymät-oppitunti CoddyKitissä. Tämä on oppitunti 3/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Spring Boot 4 -mikropalvelut ja REST-sovellusliittymät-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Spring Boot 4 -mikropalvelut ja REST-sovellusliittymät-kurssilla on yhteensä 4 oppituntia.

Hajanaisten try/catch-lohkojen ongelma

Virheiden käsittely try/catch-lohkoilla jokaisessa ohjaimessa monistaa koodia ja tuottaa epäyhtenäisiä vastauksia. Spring MVC tarjoaa keskitetyn mallin: poikkeuskäsittelijät, jotka muuttavat poikkeukset selkeiksi HTTP-vastauksiksi.

Paikallinen @ExceptionHandler

Ohjaimen sisällä oleva @ExceptionHandler-annotaatiolla merkitty metodi käsittelee lueteltuja poikkeustyyppejä kyseisessä ohjaimessa. Se muuntaa poikkeuksen vastaukseksi.

@RestController
public class OrderController {
    @ExceptionHandler(OrderNotFoundException.class)
    public ResponseEntity<String> handleNotFound(OrderNotFoundException ex) {
        return ResponseEntity.status(HttpStatus.NOT_FOUND).body(ex.getMessage());
    }
}

Keskitetty käsittely @ControllerAdvice-annotaatiolla

@ControllerAdvice (tai @RestControllerAdvice) sisältää poikkeuskäsittelijät, joita sovelletaan kaikkiin ohjaimiin. Näin virheenkäsittely keskitetään yhteen luokkaan.

@RestControllerAdvice
public class GlobalExceptionHandler {
    // handlers shared by every controller
}

Toimialuepoikkeuksen käsittely

Määritä omille poikkeuksillesi käsittelijät, jotka palauttavat oikean tilan ja rakenteisen rungon. Sama logiikka palvelee nyt kaikkia päätepisteitä.

@RestControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(ResourceNotFoundException.class)
    @ResponseStatus(HttpStatus.NOT_FOUND)
    public ApiError notFound(ResourceNotFoundException ex) {
        return new ApiError("NOT_FOUND", ex.getMessage());
    }
}

Yhtenäinen virhe-DTO

Palauta yhdenmukainen virherakenne, jotta asiakkaat voivat jäsentää virheet ennakoitavasti. Sisällytä koodi, käyttäjälle tarkoitettu viesti ja halutessasi aikaleima sekä kenttäkohtaiset tiedot.

public record ApiError(
        String code,
        String message,
        Instant timestamp) {
    public ApiError(String code, String message) {
        this(code, message, Instant.now());
    }
}

Validointivirheiden käsittely

Sieppaa MethodArgumentNotValidException, jotta Bean Validation -virheet voidaan muuntaa selkeäksi kenttäkohtaiseksi vastaukseksi Springin oletusrungon sijaan.

@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public Map<String, String> handleValidation(MethodArgumentNotValidException ex) {
    Map<String, String> errors = new HashMap<>();
    ex.getBindingResult().getFieldErrors()
        .forEach(e -> errors.put(e.getField(), e.getDefaultMessage()));
    return errors;
}

Kaikkiin tilanteisiin sopiva käsittelijä

Lisää Exception-poikkeukselle käsittelijä varmistukseksi ja palauta tilana 500 yleisellä viestillä. Kirjaa todellinen poikkeus lokiin, mutta älä koskaan paljasta pinokehystietoja asiakkaille.

@ExceptionHandler(Exception.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public ApiError handleUnexpected(Exception ex) {
    log.error("Unhandled error", ex);
    return new ApiError("INTERNAL_ERROR", "Something went wrong");
}

Käsittelijän valintajärjestys

Spring valitsee käsittelijän, jonka poikkeustyyppi vastaa lähimmin heitettyä poikkeusta. OrderNotFoundException-käsittelijä voittaa sen yliluokan käsittelijän, joten täsmällisemmät käsittelijät ovat etusijalla.

Advice-käsittelyn rajaaminen

Voit rajata @ControllerAdvice-annotaation koskemaan tiettyjä paketteja, annotaatioita tai ohjaintyyppejä. Näin esimerkiksi julkisille ja sisäisille rajapinnoille voidaan määrittää erilaiset virhekäytännöt.

@RestControllerAdvice(basePackages = "com.example.api.publicapi")
public class PublicApiExceptionHandler { }

Pyyntöön käsiksi pääseminen

Käsittelijämetodit voivat vastaanottaa lisäparametreja, kuten WebRequest- tai HttpServletRequest-olion, jotta vastaukseen voidaan lisätä esimerkiksi polku tai korrelaatiotunnus.

@ExceptionHandler(ResourceNotFoundException.class)
public ApiError notFound(ResourceNotFoundException ex, HttpServletRequest req) {
    return new ApiError("NOT_FOUND", ex.getMessage() + " at " + req.getRequestURI());
}

Tietoturva: älä jaa liikaa tietoja

Virhevastaudet ovat yleinen tietovuotojen lähde. Palauta asiakkaille toiminnan kannalta riittävät tiedot, mutta älä koskaan paljasta sisäisiä luokkien nimiä, SQL-kyselyitä tai pinokehystietoja. Kirjaa yksityiskohdat sen sijaan palvelimella.

Pikatarkistus

Testaa ymmärryksesi keskitetystä käsittelystä.

Kertaus

Keskitytä virheenkäsittely.

  • @ExceptionHandler muuntaa poikkeukset vastauksiksi
  • @ControllerAdvice soveltaa käsittelijöitä kaikkiin ohjaimiin
  • Palauta yhdenmukainen virhe-DTO
  • Käsittele validointi-, toimialue- ja kaikkiin tilanteisiin sopivat tapaukset
  • Täsmällisin käsittelijä voittaa; älä koskaan paljasta sisäisiä tietoja asiakkaille
Aloita maksutta

Opi Java tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
24
Oppitunnit
93

Usein kysytyt kysymykset

Onko oppitunti ”@ControllerAdvice ja @ExceptionHandler” ilmainen?

Kyllä – oppitunnin ”@ControllerAdvice ja @ExceptionHandler” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Spring Boot 4 -mikropalvelut ja REST-sovellusliittymät-kurssin, päivitä CoddyKit PROhon. Spring Boot 4 -mikropalvelut ja REST-sovellusliittymät-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”@ControllerAdvice ja @ExceptionHandler”?

Käsitelkää poikkeukset keskitetysti. Harjoittelet Spring Boot 4 -mikropalvelut ja REST-sovellusliittymät-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Spring Boot 4 -mikropalvelut ja REST-sovellusliittymät-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Spring Boot 4 -mikropalvelut ja REST-sovellusliittymät-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/4.

Kuinka kauan ”@ControllerAdvice ja @ExceptionHandler”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Spring Boot 4 -mikropalvelut ja REST-sovellusliittymät-oppitunnilla?

Kyllä. Jokainen Spring Boot 4 -mikropalvelut ja REST-sovellusliittymät-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Bean-validointi @Valid-annotaatiolla
  2. Mukautetut validaattorit
  3. @ControllerAdvice ja @ExceptionHandler
  4. Problem Details (RFC 7807)
← Takaisin: Spring Boot 4 -mikropalvelut ja REST-sovellusliittymät