0Pricing
Java Academy · Ders

RFC 7807 Problem Ayrıntıları ve Tutarlı Hata Yanıtları

Spring 6'nın ProblemDetail'ini kullanarak RFC 7807 ile uyumlu yapılandırılmış hata yükleri döndürün.

RFC 7807 Problem Ayrıntıları ve Tutarlı Hata Yanıtları, CoddyKit'te ücretsiz bir Java Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Java Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Java Academy kursu toplamda 4 dersten oluşur.

RFC 7807 Nedir?

RFC 7807, "HTTP API'leri için Sorun Ayrıntıları" ile hata yanıtları için standart bir JSON biçimi tanımlar. Her API için özel hata biçimleri kullanılmasını önler ve istemcilere ayrıştırabilecekleri öngörülebilir bir yapı sağlar.

RFC 7807 Alanları

Standart alanlar: type (sorunu tanımlayan URI), title (insanın okuyabileceği özet), status (HTTP durum kodu), detail (belirli açıklama), instance (belirli oluşumun URI'si).

{
  "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"
}

Spring 6 ProblemDetail

Spring 6 / Spring Boot 3, yerleşik ProblemDetail desteğiyle gelir. İstisna işleyicilerinden ProblemDetail döndürün veya ErrorResponseException kullanın.

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;
}

Özel Uzantılar Ekleme

ProblemDetail, hata kodları veya alan hataları gibi alana özgü ayrıntılar için setProperty(key, value) aracılığıyla uzantı özelliklerini destekler.

ProblemDetail pd = ProblemDetail.forStatus(HttpStatus.BAD_REQUEST);
pd.setTitle("Validation Failed");
pd.setProperty("errors", fieldErrors); // custom extension
pd.setProperty("timestamp", Instant.now());

Spring MVC için RFC 7807'yi Etkinleştirme

Yerleşik tüm Spring istisnaları için ProblemDetail desteğini etkinleştirmek üzere application.properties içinde spring.mvc.problemdetails.enabled=true ayarını yapın. Spring, standart istisnaları (404, 405 vb.) otomatik olarak RFC 7807 biçiminde sarar.

# application.properties:
spring.mvc.problemdetails.enabled=true

ErrorResponseException

Bir işleyici yöntemi olmadan RFC 7807 yanıtı üretmek için hizmet kodundan ErrorResponseException fırlatın; Spring MVC bunu yakalayıp biçimlendirir.

throw new ErrorResponseException(HttpStatus.CONFLICT,
    ProblemDetail.forStatusAndDetail(HttpStatus.CONFLICT,
        "Email already exists: " + email), null);

Özel ProblemDetail Alt Sınıfı

Türü belirli uzantı alanları eklemek ve işleyici kodunu temiz tutmak için ProblemDetail sınıfından alana özgü bir alt sınıf oluşturun.

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);
    }
}

İçerik Türü: application/problem+json

RFC 7807 yanıtları, istemcilerin sorun yanıtlarını normal JSON yüklerinden ayırt edebilmesi için application/problem+json içerik türünü kullanmalıdır.

return ResponseEntity.status(HttpStatus.NOT_FOUND)
    .contentType(MediaType.APPLICATION_PROBLEM_JSON)
    .body(pd);

Tutarlı Hata Yapısı Kontrol Listesi

İyi bir hata API'si şunları içerir: (1) makineler tarafından okunabilen tür URI'si, (2) insanların okuyabileceği başlık, (3) tam HTTP durum kodu, (4) belirli ayrıntı iletisi, (5) istek oluşumunun URI'si, (6) isteğe bağlı uzantı alanları (zaman damgası, traceId, alan hataları).

Gözlemlenebilirlik için Trace ID'leri

Mühendislerin hata günlüklerini belirli bir başarısız istekle ilişkilendirebilmesi için isteğin trace ID'sini (Micrometer Tracing veya MDC'den) bir uzantı özelliği olarak ekleyin.

pd.setProperty("traceId", MDC.get("traceId"));
pd.setProperty("timestamp", Instant.now());

Problem Details'ı Sınama

@WebMvcTest sınamalarında yanıt içerik türünün application/problem+json olduğunu ve status, title ve detail gibi JSON alanlarının beklenen değerlerle eşleştiğini doğrulayın.

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"));

Kısa Kontrol

Yerleşik Spring MVC istisnaları için RFC 7807'yi hangi Spring Boot özelliği etkinleştirir?

Özet

RFC 7807, hata yanıtlarını type, title, status, detail ve instance alanlarıyla standartlaştırır. Spring 6, ProblemDetail ve ErrorResponseException sağlar. spring.mvc.problemdetails.enabled=true ile etkinleştirin. Gözlemlenebilirlik için traceId ve zaman damgasını uzantı olarak ekleyin.

Sıkça Sorulan Sorular

“RFC 7807 Problem Ayrıntıları ve Tutarlı Hata Yanıtları” dersi ücretsiz mi?

Evet — “RFC 7807 Problem Ayrıntıları ve Tutarlı Hata Yanıtları” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Java Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Java Academy kursu toplamda 4 dersten oluşur.

“RFC 7807 Problem Ayrıntıları ve Tutarlı Hata Yanıtları” dersinde ne öğreneceğim?

Spring 6'nın ProblemDetail'ini kullanarak RFC 7807 ile uyumlu yapılandırılmış hata yükleri döndürün. Java Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Java Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Java Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.

“RFC 7807 Problem Ayrıntıları ve Tutarlı Hata Yanıtları” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Java Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Java Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Bean Doğrulaması: @NotNull, @Size, @Pattern
  2. Özel Kısıtlama Ek Açıklamaları
  3. @ControllerAdvice ile Genel İstisna Yönetimi
  4. RFC 7807 Problem Ayrıntıları ve Tutarlı Hata Yanıtları
← Java Academy Sayfasına Dön