0Pricing
Java Academy · บทเรียน

รายละเอียดปัญหา 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=true

ErrorResponseException

โยน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การตรวจสอบ Bean: @NotNull, @Size, @Pattern
  2. คำอธิบายข้อจำกัดแบบกำหนดเอง
  3. การจัดการข้อยกเว้นแบบรวมศูนย์ด้วย @ControllerAdvice
  4. รายละเอียดปัญหา RFC 7807 และการตอบกลับข้อผิดพลาดอย่างสอดคล้อง
← กลับไปที่ Java Academy