@ControllerAdvice ja @ExceptionHandler
Käsitelkää poikkeukset keskitetysti.
@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.
@ExceptionHandlermuuntaa poikkeukset vastauksiksi@ControllerAdvicesoveltaa 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
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
- Bean-validointi @Valid-annotaatiolla
- Mukautetut validaattorit
- @ControllerAdvice ja @ExceptionHandler
- Problem Details (RFC 7807)