Detail Masalah RFC 7807 dan Respons Error yang Konsisten
Kembalikan payload error terstruktur yang sesuai dengan RFC 7807 menggunakan ProblemDetail dari Spring 6.
Detail Masalah RFC 7807 dan Respons Error yang Konsisten adalah pelajaran Java Academy gratis di CoddyKit. Ini adalah pelajaran 4 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.
Apa Itu RFC 7807?
RFC 7807 "Problem Details for HTTP APIs" mendefinisikan format JSON standar untuk respons kesalahan. Format ini menghindari format kesalahan khusus untuk setiap API dan memberi klien struktur yang konsisten untuk diurai.
Bidang RFC 7807
Bidang standar: type (URI yang mengidentifikasi masalah), title (ringkasan yang dapat dibaca manusia), status (kode status HTTP), detail (penjelasan spesifik), instance (URI dari kejadian tertentu).
{
"type": "https://api.example.com/errors/not-found",
"title": "Resource Not Found",
"status": 404,
"detail": "User with id 42 does not exist.",
"instance": "/api/users/42"
}ProblemDetail di Spring 6
Spring 6 / Spring Boot 3 dilengkapi dukungan bawaan untuk ProblemDetail. Kembalikan ProblemDetail dari penanganan pengecualian atau gunakan ErrorResponseException.
import org.springframework.http.ProblemDetail;
@ExceptionHandler(ResourceNotFoundException.class)
public ProblemDetail handleNotFound(ResourceNotFoundException ex, HttpServletRequest req) {
ProblemDetail pd = ProblemDetail.forStatusAndDetail(HttpStatus.NOT_FOUND, ex.getMessage());
pd.setType(URI.create("https://api.example.com/errors/not-found"));
pd.setTitle("Resource Not Found");
pd.setInstance(URI.create(req.getRequestURI()));
return pd;
}Menambahkan Ekstensi Kustom
ProblemDetail mendukung properti ekstensi melalui setProperty(key, value) untuk detail khusus domain seperti kode kesalahan atau kesalahan bidang.
ProblemDetail pd = ProblemDetail.forStatus(HttpStatus.BAD_REQUEST);
pd.setTitle("Validation Failed");
pd.setProperty("errors", fieldErrors); // custom extension
pd.setProperty("timestamp", Instant.now());Mengaktifkan RFC 7807 untuk Spring MVC
Aktifkan ProblemDetail untuk semua pengecualian bawaan Spring dengan menetapkan spring.mvc.problemdetails.enabled=true di application.properties. Spring kemudian membungkus pengecualian standar (404, 405, dan sebagainya) dalam format RFC 7807 secara otomatis.
# application.properties:
spring.mvc.problemdetails.enabled=trueErrorResponseException
Lemparkan ErrorResponseException dari kode layanan untuk menghasilkan respons RFC 7807 tanpa metode penanganan—Spring MVC akan menangkap dan memformatnya.
throw new ErrorResponseException(HttpStatus.CONFLICT,
ProblemDetail.forStatusAndDetail(HttpStatus.CONFLICT,
"Email already exists: " + email), null);Subkelas ProblemDetail Kustom
Buat subkelas khusus domain dari ProblemDetail untuk menambahkan bidang ekstensi bertipe dan menjaga kode penanganan tetap rapi.
public class ValidationProblemDetail extends ProblemDetail {
private final Map<String, String> fieldErrors;
public ValidationProblemDetail(Map<String, String> errors) {
super(HttpStatus.BAD_REQUEST.value());
this.fieldErrors = errors;
setTitle("Validation Failed");
setProperty("fieldErrors", errors);
}
}Jenis Konten: application/problem+json
Respons RFC 7807 seharusnya menggunakan jenis konten application/problem+json agar klien dapat membedakan respons masalah dari muatan JSON biasa.
return ResponseEntity.status(HttpStatus.NOT_FOUND)
.contentType(MediaType.APPLICATION_PROBLEM_JSON)
.body(pd);Daftar Periksa Struktur Kesalahan yang Konsisten
API kesalahan yang baik memiliki: (1) URI tipe yang dapat dibaca mesin, (2) judul yang dapat dibaca manusia, (3) kode status HTTP yang tepat, (4) pesan detail yang spesifik, (5) URI instans permintaan, (6) bidang ekstensi opsional (stempel waktu, traceId, kesalahan bidang).
ID Pelacakan untuk Observabilitas
Tambahkan ID pelacakan permintaan (dari Micrometer Tracing atau MDC) sebagai properti ekstensi agar pengembang dapat menghubungkan log kesalahan dengan permintaan tertentu yang gagal.
pd.setProperty("traceId", MDC.get("traceId"));
pd.setProperty("timestamp", Instant.now());Menguji Detail Masalah
Dalam pengujian @WebMvcTest, pastikan jenis konten respons adalah application/problem+json dan bidang JSON seperti status, title, serta detail cocok dengan nilai yang diharapkan.
mockMvc.perform(get("/api/users/999"))
.andExpect(status().isNotFound())
.andExpect(content().contentType("application/problem+json"))
.andExpect(jsonPath("$.status").value(404))
.andExpect(jsonPath("$.title").value("Resource Not Found"));Pemeriksaan Singkat
Properti Spring Boot apa yang mengaktifkan RFC 7807 untuk pengecualian bawaan Spring MVC?
Rangkuman
RFC 7807 menstandarkan respons kesalahan JSON dengan bidang type, title, status, detail, dan instance. Spring 6 menyediakan ProblemDetail dan ErrorResponseException. Aktifkan dengan spring.mvc.problemdetails.enabled=true. Tambahkan traceId dan stempel waktu sebagai ekstensi untuk observabilitas.
Belajar Java dengan tutor AI — gratis
Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.
- Kursus
- 104
- Pelajaran
- 374
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Detail Masalah RFC 7807 dan Respons Error yang Konsisten” gratis?
Ya — teks lengkap “Detail Masalah RFC 7807 dan Respons Error yang Konsisten” 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 “Detail Masalah RFC 7807 dan Respons Error yang Konsisten”?
Kembalikan payload error terstruktur yang sesuai dengan RFC 7807 menggunakan ProblemDetail dari Spring 6. 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 4 dari 4.
Berapa lama pelajaran “Detail Masalah RFC 7807 dan Respons Error yang Konsisten” 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