Butiran Masalah RFC 7807 dan Respons Ralat yang Konsisten
Kembalikan muatan ralat berstruktur yang mematuhi RFC 7807 menggunakan ProblemDetail Spring 6.
Butiran Masalah RFC 7807 dan Respons Ralat yang Konsisten ialah pelajaran Java Academy percuma di CoddyKit. Ini ialah pelajaran 4 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Java Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Java Academy merangkumi sejumlah 4 pelajaran.
Apakah RFC 7807?
RFC 7807 "Butiran Masalah untuk API HTTP" mentakrifkan format JSON standard untuk respons ralat. Format ini mengelakkan format ralat tersuai bagi setiap API dan memberikan struktur yang boleh dijangka untuk dihuraikan oleh klien.
Medan RFC 7807
Medan standard: type (URI yang mengenal pasti masalah), title (ringkasan yang boleh dibaca manusia), status (kod status HTTP), detail (penerangan khusus), instance (URI kejadian khusus).
{
"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 Spring 6
Spring 6 / Spring Boot 3 disertakan dengan sokongan terbina dalam untuk ProblemDetail. Kembalikan ProblemDetail daripada pengendali 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;
}Menambah Sambungan Tersuai
ProblemDetail menyokong sifat sambungan melalui setProperty(key, value) untuk butiran khusus domain seperti kod ralat atau ralat medan.
ProblemDetail pd = ProblemDetail.forStatus(HttpStatus.BAD_REQUEST);
pd.setTitle("Validation Failed");
pd.setProperty("errors", fieldErrors); // custom extension
pd.setProperty("timestamp", Instant.now());Mendayakan RFC 7807 untuk Spring MVC
Dayakan ProblemDetail untuk semua pengecualian Spring terbina dalam dengan menetapkan spring.mvc.problemdetails.enabled=true dalam application.properties. Spring kemudian membungkus pengecualian standard (404, 405 dan sebagainya) dalam format RFC 7807 secara automatik.
# application.properties:
spring.mvc.problemdetails.enabled=trueErrorResponseException
Lontarkan ErrorResponseException daripada kod perkhidmatan untuk menghasilkan respons RFC 7807 tanpa kaedah pengendali — Spring MVC menangkap dan memformatnya.
throw new ErrorResponseException(HttpStatus.CONFLICT,
ProblemDetail.forStatusAndDetail(HttpStatus.CONFLICT,
"Email already exists: " + email), null);Subkelas ProblemDetail Tersuai
Cipta subkelas ProblemDetail khusus domain untuk menambah medan sambungan bertip dan memastikan kod pengendali kekal kemas.
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 Kandungan: application/problem+json
Respons RFC 7807 hendaklah menggunakan jenis kandungan application/problem+json supaya klien dapat membezakan respons masalah daripada muatan JSON biasa.
return ResponseEntity.status(HttpStatus.NOT_FOUND)
.contentType(MediaType.APPLICATION_PROBLEM_JSON)
.body(pd);Senarai Semak Struktur Ralat Konsisten
API ralat yang baik mempunyai: (1) URI jenis yang boleh dibaca mesin, (2) tajuk yang boleh dibaca manusia, (3) kod status HTTP yang tepat, (4) mesej perincian khusus, (5) URI kejadian permintaan, (6) medan sambungan pilihan (cap masa, traceId, ralat medan).
ID Surih untuk Kebolehlihatan
Tambahkan ID surih permintaan (daripada Micrometer Tracing atau MDC) sebagai sifat sambungan supaya jurutera dapat mengaitkan log ralat dengan permintaan khusus yang gagal.
pd.setProperty("traceId", MDC.get("traceId"));
pd.setProperty("timestamp", Instant.now());Menguji Butiran Masalah
Dalam ujian @WebMvcTest, sahkan bahawa jenis kandungan respons ialah application/problem+json dan medan JSON seperti status, title dan detail sepadan dengan nilai yang dijangka.
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"));Semakan Pantas
Sifat Spring Boot manakah yang mendayakan RFC 7807 untuk pengecualian Spring MVC terbina dalam?
Rumusan
RFC 7807 menyeragamkan respons ralat JSON dengan medan type, title, status, detail dan instance. Spring 6 menyediakan ProblemDetail dan ErrorResponseException. Dayakan dengan spring.mvc.problemdetails.enabled=true. Tambahkan traceId dan cap masa sebagai sambungan untuk kebolehlihatan.
Pelajari Java dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 104
- Pelajaran
- 374
Soalan Lazim
Adakah pelajaran “Butiran Masalah RFC 7807 dan Respons Ralat yang Konsisten” percuma?
Ya — teks penuh “Butiran Masalah RFC 7807 dan Respons Ralat yang Konsisten” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Java Academy, tingkat taraf kepada CoddyKit PRO. Kursus Java Academy merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Butiran Masalah RFC 7807 dan Respons Ralat yang Konsisten”?
Kembalikan muatan ralat berstruktur yang mematuhi RFC 7807 menggunakan ProblemDetail Spring 6. Anda berlatih Java Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan Java Academy?
Tiada pengalaman terdahulu diperlukan. Pembelajaran Java Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 4 daripada 4.
Berapa lamakah pelajaran “Butiran Masalah RFC 7807 dan Respons Ralat yang Konsisten” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran Java Academy ini?
Ya. Setiap pelajaran Java Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Pengesahan Bean: @NotNull, @Size, @Pattern
- Anotasi Kekangan Tersuai
- Pengendalian Pengecualian Global dengan @ControllerAdvice
- Butiran Masalah RFC 7807 dan Respons Ralat yang Konsisten