0Pricing
Java Academy · Ders

@ControllerAdvice ile Genel İstisna Yönetimi

@ExceptionHandler ve @ControllerAdvice ile tüm denetleyicilerdeki istisna yönetimini merkezileştirin.

@ControllerAdvice ile Genel İstisna Yönetimi, CoddyKit'te ücretsiz bir Java Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Java Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Java Academy kursu toplamda 4 dersten oluşur.

Genel Yönetim Olmadığında Sorun

Genel istisna yönetimi olmadan her denetleyici yönteminde hata yakalama blokları gerekir, hata yanıtı oluşturma işlemi yinelenir ve istisna ayrıntıları istemcilere sızar.

@ControllerAdvice ve @RestControllerAdvice

@ControllerAdvice, genel bir istisna işleyicisi sınıfı tanımlar. @RestControllerAdvice, @ResponseBody ekleyerek tüm işleyici yöntemlerinin otomatik olarak JSON döndürmesini sağlar.

@RestControllerAdvice
public class GlobalExceptionHandler {
    // @ExceptionHandler methods go here
}

@ExceptionHandler Yöntemleri

Bir yöntemi @ExceptionHandler(ExceptionType.class) ile işaretleyin. Spring, bu türdeki (ve alt türlerindeki) istisnaları yönteme yönlendirir. Uygun durum koduna sahip bir ResponseEntity döndürün.

@ExceptionHandler(ResourceNotFoundException.class)
public ResponseEntity<ErrorResponse> handleNotFound(ResourceNotFoundException ex) {
    return ResponseEntity.status(HttpStatus.NOT_FOUND)
        .body(new ErrorResponse("NOT_FOUND", ex.getMessage()));
}

Birden Çok İstisna Türünü Yönetme

Tek bir işleyicide birden çok istisna türü listeleyin veya ortak bir temel sınıf kullanın. Spring, mevcut en özel işleyiciyi seçer.

@ExceptionHandler({IllegalArgumentException.class, IllegalStateException.class})
public ResponseEntity<ErrorResponse> handleBadRequest(RuntimeException ex) {
    return ResponseEntity.badRequest()
        .body(new ErrorResponse("BAD_REQUEST", ex.getMessage()));
}

Doğrulama Hatalarını Yönetme

@Valid ile doğrulanmış istek gövdelerindeki alan düzeyindeki hataları ayıklamak için MethodArgumentNotValidException'ı yakalayın.

@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<Map<String, Object>> handleValidation(MethodArgumentNotValidException ex) {
    Map<String, String> fieldErrors = new LinkedHashMap<>();
    ex.getBindingResult().getFieldErrors().forEach(e ->
        fieldErrors.put(e.getField(), e.getDefaultMessage()));
    return ResponseEntity.badRequest()
        .body(Map.of("errors", fieldErrors, "status", 400));
}

Kısıt İhlallerini Yönetme

Hizmet katmanında @Validated ile yöntem parametreleri doğrulanırken ConstraintViolationException fırlatılır. Bunu MVC doğrulama hatalarından ayrı olarak yönetin.

@ExceptionHandler(ConstraintViolationException.class)
public ResponseEntity<Map<String, String>> handleConstraint(ConstraintViolationException ex) {
    Map<String, String> errors = new LinkedHashMap<>();
    ex.getConstraintViolations().forEach(v ->
        errors.put(v.getPropertyPath().toString(), v.getMessage()));
    return ResponseEntity.badRequest().body(errors);
}

HttpServletRequest'e Erişim

Kayıt tutmak veya hata yanıtına eklemek üzere istek ayrıntılarını (URL, yöntem ve üst bilgiler) almak için parametre olarak HttpServletRequest ekleyin.

@ExceptionHandler(Exception.class)
public ResponseEntity<ErrorResponse> handleAll(Exception ex, HttpServletRequest req) {
    log.error("Unhandled error on {} {}", req.getMethod(), req.getRequestURI(), ex);
    return ResponseEntity.internalServerError()
        .body(new ErrorResponse("INTERNAL_ERROR", "Unexpected error"));
}

İstisna Sınıflarında @ResponseStatus

Özel istisna sınıflarını @ResponseStatus ile işaretleyerek bir işleyici yöntemi olmadan HTTP durumunu otomatik olarak ayarlayın; bu, basit durumlar için daha kolaydır.

@ResponseStatus(HttpStatus.NOT_FOUND)
public class ResourceNotFoundException extends RuntimeException {
    public ResourceNotFoundException(String msg) { super(msg); }
}

@ControllerAdvice Kapsamını Belirleme

@ControllerAdvice üzerindeki öznitelikleri kullanarak tavsiyeyi belirli paketler, anotasyonlar veya temel sınıflarla sınırlandırın.

@RestControllerAdvice(basePackages = "com.example.api")
public class ApiExceptionHandler { ... }
@RestControllerAdvice(assignableTypes = {UserController.class, OrderController.class})
public class SpecificHandler { ... }

İstisna İşleyicilerinde Kayıt Tutma

İstisnaları uygun düzeyde kaydedin: kullanıcı hatalarını (4xx) WARN, beklenmeyen hataları (5xx) tam yığın iziyle ERROR düzeyinde kaydedin.

@ExceptionHandler(Exception.class)
public ResponseEntity<ErrorResponse> handleAll(Exception ex, HttpServletRequest req) {
    if (ex instanceof BusinessException) log.warn("Business error: {}", ex.getMessage());
    else log.error("Unexpected error on {}", req.getRequestURI(), ex);
    return ...
}

İstisna İşleyicisi Önceliği

Spring, en özel işleyiciyi seçer. ResourceNotFoundException extends RuntimeException durumunda, ResourceNotFoundException için tanımlanan işleyici, RuntimeException için tanımlanan işleyiciye göre önceliklidir.

Kısa Kontrol

Belirli bir istisna türünü genel olarak ele alacak bir yöntemi hangi ek açıklama işaretler?

Özet

Hata işlemeyi merkezileştirmek için @RestControllerAdvice ve @ExceptionHandler kullanın. Tutarlı bir hata yapısına sahip ResponseEntity döndürün. Doğrulama (MethodArgumentNotValidException) ile kısıtlamaları (ConstraintViolationException) ayrı ayrı ele alın. 4xx hatalarını WARN, 5xx hatalarını ERROR olarak günlüğe kaydedin.

Sıkça Sorulan Sorular

“@ControllerAdvice ile Genel İstisna Yönetimi” dersi ücretsiz mi?

Evet — “@ControllerAdvice ile Genel İstisna Yönetimi” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Java Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Java Academy kursu toplamda 4 dersten oluşur.

“@ControllerAdvice ile Genel İstisna Yönetimi” dersinde ne öğreneceğim?

@ExceptionHandler ve @ControllerAdvice ile tüm denetleyicilerdeki istisna yönetimini merkezileştirin. Java Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Java Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Java Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.

“@ControllerAdvice ile Genel İstisna Yönetimi” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Java Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Java Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Bean Doğrulaması: @NotNull, @Size, @Pattern
  2. Özel Kısıtlama Ek Açıklamaları
  3. @ControllerAdvice ile Genel İstisna Yönetimi
  4. RFC 7807 Problem Ayrıntıları ve Tutarlı Hata Yanıtları
← Java Academy Sayfasına Dön