Penanganan Pengecualian Global dengan @ControllerAdvice
Pusatkan penanganan pengecualian di semua controller dengan @ExceptionHandler dan @ControllerAdvice.
Penanganan Pengecualian Global dengan @ControllerAdvice adalah pelajaran Java Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Java Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Java Academy mencakup 4 pelajaran total.
Masalah Tanpa Penanganan Global
Tanpa penanganan pengecualian global, setiap metode pengendali memerlukan blok try-catch, pembuatan respons kesalahan diduplikasi, dan detail pengecualian dapat bocor kepada klien.
@ControllerAdvice dan @RestControllerAdvice
@ControllerAdvice mendefinisikan kelas penangan pengecualian global. @RestControllerAdvice menambahkan @ResponseBody sehingga semua metode penangan secara otomatis mengembalikan JSON.
@RestControllerAdvice
public class GlobalExceptionHandler {
// @ExceptionHandler methods go here
}Metode @ExceptionHandler
Anotasiasikan metode dengan @ExceptionHandler(ExceptionType.class). Spring mengarahkan pengecualian jenis tersebut (dan subkelasnya) ke metode itu. Kembalikan ResponseEntity dengan status yang sesuai.
@ExceptionHandler(ResourceNotFoundException.class)
public ResponseEntity<ErrorResponse> handleNotFound(ResourceNotFoundException ex) {
return ResponseEntity.status(HttpStatus.NOT_FOUND)
.body(new ErrorResponse("NOT_FOUND", ex.getMessage()));
}Menangani Beberapa Jenis Pengecualian
Daftarkan beberapa jenis pengecualian dalam satu penangan atau gunakan kelas dasar umum. Spring memilih penangan paling spesifik yang tersedia.
@ExceptionHandler({IllegalArgumentException.class, IllegalStateException.class})
public ResponseEntity<ErrorResponse> handleBadRequest(RuntimeException ex) {
return ResponseEntity.badRequest()
.body(new ErrorResponse("BAD_REQUEST", ex.getMessage()));
}Menangani Kesalahan Validasi
Tangkap MethodArgumentNotValidException untuk mengekstrak kesalahan tingkat bidang dari body permintaan yang divalidasi dengan @Valid.
@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));
}Menangani Pelanggaran Batasan
ConstraintViolationException dilempar saat memvalidasi parameter metode dengan @Validated pada lapisan layanan. Tangani secara terpisah dari kesalahan validasi MVC.
@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);
}Mengakses HttpServletRequest
Tambahkan HttpServletRequest sebagai parameter untuk mendapatkan detail permintaan (URL, metode, header) guna pencatatan atau penyertaan dalam respons kesalahan.
@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"));
}@ResponseStatus pada Kelas Pengecualian
Anotasiasikan kelas pengecualian kustom dengan @ResponseStatus untuk menetapkan status HTTP secara otomatis tanpa metode penangan — lebih sederhana untuk kasus langsung.
@ResponseStatus(HttpStatus.NOT_FOUND)
public class ResourceNotFoundException extends RuntimeException {
public ResourceNotFoundException(String msg) { super(msg); }
}Membatasi Cakupan @ControllerAdvice
Batasi penanganan pada paket, anotasi, atau kelas dasar tertentu menggunakan atribut pada @ControllerAdvice.
@RestControllerAdvice(basePackages = "com.example.api")
public class ApiExceptionHandler { ... }
@RestControllerAdvice(assignableTypes = {UserController.class, OrderController.class})
public class SpecificHandler { ... }Pencatatan dalam Penangan Pengecualian
Catat pengecualian pada tingkat yang sesuai: kesalahan pengguna (4xx) pada WARN, dan kesalahan tak terduga (5xx) pada ERROR dengan jejak tumpukan lengkap.
@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 ...
}Prioritas Penanganan Pengecualian
Spring memilih penanganan yang paling spesifik. Jika ResourceNotFoundException extends RuntimeException, penanganan untuk ResourceNotFoundException lebih diprioritaskan daripada penanganan untuk RuntimeException.
Pemeriksaan Singkat
Anotasi apa yang menandai suatu metode untuk menangani jenis pengecualian tertentu secara global?
Rangkuman
Gunakan @RestControllerAdvice + @ExceptionHandler untuk memusatkan penanganan kesalahan. Kembalikan ResponseEntity dengan struktur kesalahan yang konsisten. Tangani validasi (MethodArgumentNotValidException) dan batasan (ConstraintViolationException) secara terpisah. Catat 4xx sebagai WARN dan 5xx sebagai ERROR.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Penanganan Pengecualian Global dengan @ControllerAdvice” gratis?
Ya — teks lengkap “Penanganan Pengecualian Global dengan @ControllerAdvice” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Java Academy, upgrade ke CoddyKit PRO. Kursus Java Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Penanganan Pengecualian Global dengan @ControllerAdvice”?
Pusatkan penanganan pengecualian di semua controller dengan @ExceptionHandler dan @ControllerAdvice. Kamu berlatih Java Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Java Academy?
Tidak diperlukan pengalaman sebelumnya. Java Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “Penanganan Pengecualian Global dengan @ControllerAdvice” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Java Academy ini?
Ya. Setiap pelajaran Java Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Validasi Bean: @NotNull, @Size, @Pattern
- Anotasi Batasan Khusus
- Penanganan Pengecualian Global dengan @ControllerAdvice
- Detail Masalah RFC 7807 dan Respons Error yang Konsisten