รายละเอียดปัญหา RFC 7807 และการตอบกลับข้อผิดพลาดอย่างสอดคล้อง
ส่งข้อมูลข้อผิดพลาดแบบมีโครงสร้างตาม RFC 7807 ด้วย ProblemDetail ของ Spring 6
รายละเอียดปัญหา RFC 7807 และการตอบกลับข้อผิดพลาดอย่างสอดคล้อง เป็นบทเรียน Java Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Java Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน
RFC 7807 คืออะไร
RFC 7807 "Problem Details for HTTP APIs" กำหนดรูปแบบ JSON มาตรฐานสำหรับการตอบกลับข้อผิดพลาด ช่วยหลีกเลี่ยงการใช้รูปแบบข้อผิดพลาดแบบกำหนดเองในแต่ละ API และทำให้ไคลเอนต์มีโครงสร้างที่คาดเดาได้สำหรับการแยกวิเคราะห์
ฟิลด์ของ RFC 7807
ฟิลด์มาตรฐาน ได้แก่ type (URI ที่ระบุปัญหา), title (สรุปที่มนุษย์อ่านเข้าใจ), status (รหัสสถานะ HTTP), detail (คำอธิบายเฉพาะ) และ instance (URI ของเหตุการณ์ที่เกิดขึ้นนั้น)
{
"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 มีการรองรับ ProblemDetail ในตัว คุณสามารถส่งคืน ProblemDetail จากตัวจัดการข้อยกเว้น หรือใช้ 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;
}การเพิ่มส่วนขยายแบบกำหนดเอง
ProblemDetail รองรับคุณสมบัติส่วนขยายผ่าน setProperty(key, value) เพื่อเก็บรายละเอียดเฉพาะโดเมน เช่น รหัสข้อผิดพลาดหรือข้อผิดพลาดของฟิลด์
ProblemDetail pd = ProblemDetail.forStatus(HttpStatus.BAD_REQUEST);
pd.setTitle("Validation Failed");
pd.setProperty("errors", fieldErrors); // custom extension
pd.setProperty("timestamp", Instant.now());การเปิดใช้ RFC 7807 สำหรับ Spring MVC
เปิดใช้ ProblemDetail สำหรับข้อยกเว้นมาตรฐานทั้งหมดของ Spring โดยกำหนดค่า spring.mvc.problemdetails.enabled=true ใน application.properties จากนั้น Spring จะห่อหุ้มข้อยกเว้นมาตรฐาน เช่น 404 และ 405 ให้อยู่ในรูปแบบ RFC 7807 โดยอัตโนมัติ
# application.properties:
spring.mvc.problemdetails.enabled=trueErrorResponseException
โยน ErrorResponseException จากโค้ดบริการเพื่อสร้างการตอบกลับในรูปแบบ RFC 7807 โดยไม่ต้องมีเมธอดตัวจัดการ — Spring MVC จะดักจับและจัดรูปแบบให้
throw new ErrorResponseException(HttpStatus.CONFLICT,
ProblemDetail.forStatusAndDetail(HttpStatus.CONFLICT,
"Email already exists: " + email), null);คลาสย่อยของ ProblemDetail แบบกำหนดเอง
สร้างคลาสย่อยของ ProblemDetail ที่เฉพาะกับโดเมนเพื่อเพิ่มฟิลด์ส่วนขยายที่มีชนิดชัดเจน และทำให้โค้ดของตัวจัดการอ่านง่าย
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);
}
}ประเภทเนื้อหา: application/problem+json
การตอบกลับตาม RFC 7807 ควรใช้ประเภทเนื้อหา application/problem+json เพื่อให้ไคลเอนต์แยกการตอบกลับปัญหาออกจากข้อมูล JSON ปกติได้
return ResponseEntity.status(HttpStatus.NOT_FOUND)
.contentType(MediaType.APPLICATION_PROBLEM_JSON)
.body(pd);รายการตรวจสอบโครงสร้างข้อผิดพลาดที่สอดคล้องกัน
API ข้อผิดพลาดที่ดีควรมี: (1) URI ประเภทที่เครื่องอ่านได้ (2) ชื่อเรื่องที่มนุษย์อ่านเข้าใจ (3) รหัสสถานะ HTTP ที่ถูกต้อง (4) ข้อความรายละเอียดที่เฉพาะเจาะจง (5) URI ของเหตุการณ์ที่เกิดขึ้นกับคำขอ (6) ฟิลด์ส่วนขยายที่ไม่บังคับ เช่น เวลา รหัสติดตาม และข้อผิดพลาดของฟิลด์
รหัสติดตามเพื่อการสังเกตการณ์ระบบ
เพิ่มรหัสติดตามของคำขอ (จาก Micrometer Tracing หรือ MDC) เป็นคุณสมบัติส่วนขยาย เพื่อให้วิศวกรเชื่อมโยงบันทึกข้อผิดพลาดกับคำขอที่ล้มเหลวรายการนั้นได้
pd.setProperty("traceId", MDC.get("traceId"));
pd.setProperty("timestamp", Instant.now());การทดสอบรายละเอียดปัญหา
ในการทดสอบ @WebMvcTest ให้ตรวจสอบว่าประเภทเนื้อหาของการตอบกลับคือ application/problem+json และฟิลด์ JSON เช่น status, title และ detail ตรงกับค่าที่คาดไว้
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"));ตรวจสอบอย่างรวดเร็ว
คุณสมบัติของ Spring Boot ใดเปิดใช้ RFC 7807 สำหรับข้อยกเว้นใน Spring MVC ที่มีมาให้ในตัว
สรุป
RFC 7807 ทำให้การตอบกลับข้อผิดพลาดในรูปแบบ JSON เป็นมาตรฐานเดียวกัน โดยมีฟิลด์ type, title, status, detail และ instance Spring 6 มี ProblemDetail และ ErrorResponseException ให้ใช้ เปิดใช้ด้วย spring.mvc.problemdetails.enabled=true และเพิ่ม traceId กับเวลาเป็นส่วนขยายเพื่อการสังเกตการณ์ระบบ
คำถามที่พบบ่อย
บทเรียน “รายละเอียดปัญหา RFC 7807 และการตอบกลับข้อผิดพลาดอย่างสอดคล้อง” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “รายละเอียดปัญหา RFC 7807 และการตอบกลับข้อผิดพลาดอย่างสอดคล้อง” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Java Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “รายละเอียดปัญหา RFC 7807 และการตอบกลับข้อผิดพลาดอย่างสอดคล้อง”
ส่งข้อมูลข้อผิดพลาดแบบมีโครงสร้างตาม RFC 7807 ด้วย ProblemDetail ของ Spring 6 คุณปฏิบัติ Java Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Java Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Java Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “รายละเอียดปัญหา RFC 7807 และการตอบกลับข้อผิดพลาดอย่างสอดคล้อง” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Java Academy นี้ได้ไหม
ได้ บทเรียน Java Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การตรวจสอบ Bean: @NotNull, @Size, @Pattern
- คำอธิบายข้อจำกัดแบบกำหนดเอง
- การจัดการข้อยกเว้นแบบรวมศูนย์ด้วย @ControllerAdvice
- รายละเอียดปัญหา RFC 7807 และการตอบกลับข้อผิดพลาดอย่างสอดคล้อง