{"id":36664,"date":"2025-12-21T10:00:36","date_gmt":"2025-12-21T07:00:36","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/spring-bootta-kuresel-istisna-yonetimi-en-iyi-uygulamalar\/"},"modified":"2025-12-21T10:00:36","modified_gmt":"2025-12-21T07:00:36","slug":"spring-bootta-kuresel-istisna-yonetimi-en-iyi-uygulamalar","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/spring-bootta-kuresel-istisna-yonetimi-en-iyi-uygulamalar\/","title":{"rendered":"Spring Boot&#8217;ta K\u00fcresel \u0130stisna Y\u00f6netimi: En \u0130yi Uygulamalar"},"content":{"rendered":"<h2>Spring Boot&#8217;ta K\u00fcresel \u0130stisna Y\u00f6netimi: En \u0130yi Uygulamalar<\/h2>\n<p>Modern web uygulamalar\u0131nda istisna y\u00f6netimi, kullan\u0131c\u0131 deneyimini do\u011frudan etkileyen ve uygulaman\u0131n istikrar\u0131n\u0131 sa\u011flayan kritik bir konudur. Spring Boot, bu karma\u015f\u0131k s\u00fcreci basitle\u015ftirmek ve merkezi bir \u015fekilde y\u00f6netmek i\u00e7in g\u00fc\u00e7l\u00fc mekanizmalar sunar. Bu makalede, Spring Boot projelerinizde istisnalar\u0131 k\u00fcresel olarak nas\u0131l ele alaca\u011f\u0131n\u0131z\u0131, en iyi uygulamalar\u0131 ve s\u0131k\u00e7a kar\u015f\u0131la\u015f\u0131lan senaryolar\u0131 detayl\u0131 kod \u00f6rnekleriyle birlikte inceleyece\u011fiz. Amac\u0131m\u0131z, uygulaman\u0131z\u0131n beklenmedik durumlar kar\u015f\u0131s\u0131nda dahi tutarl\u0131 ve anla\u015f\u0131l\u0131r hata yan\u0131tlar\u0131 \u00fcretmesini sa\u011flamakt\u0131r.<\/p>\n<h3>Spring Boot&#8217;ta \u0130stisna Y\u00f6netimine Giri\u015f<\/h3>\n<p>Uygulamalar\u0131m\u0131zda hata ve istisnalar\u0131n meydana gelmesi ka\u00e7\u0131n\u0131lmazd\u0131r. Bir veritaban\u0131 ba\u011flant\u0131 hatas\u0131, ge\u00e7ersiz kullan\u0131c\u0131 giri\u015fi veya bir a\u011f zaman a\u015f\u0131m\u0131, uygulaman\u0131n normal ak\u0131\u015f\u0131n\u0131 bozabilir. Bu t\u00fcr durumlar\u0131 etkili bir \u015fekilde y\u00f6netmek, uygulaman\u0131n \u00e7\u00f6kmesini engellemek, kullan\u0131c\u0131ya anlaml\u0131 geri bildirim sa\u011flamak ve g\u00fcvenlik a\u00e7\u0131klar\u0131n\u0131 \u00f6nlemek i\u00e7in hayati \u00f6neme sahiptir.<\/p>\n<h4>\u0130stisnalar Neden \u00d6nemlidir?<\/h4>\n<p>\u0130stisnalar, program\u0131n \u00e7al\u0131\u015fma zaman\u0131nda ortaya \u00e7\u0131kan ve normal ak\u0131\u015f\u0131 bozan olaylard\u0131r. Do\u011fru y\u00f6netilmediklerinde, kullan\u0131c\u0131ya anlams\u0131z hata mesajlar\u0131 g\u00f6sterebilir, uygulaman\u0131n tamamen durmas\u0131na neden olabilir veya hassas sistem bilgilerini a\u00e7\u0131\u011fa \u00e7\u0131karabilirler. \u0130yi bir istisna y\u00f6netimi stratejisi, uygulaman\u0131n esnekli\u011fini art\u0131r\u0131r ve daha sa\u011flam bir yap\u0131 sunar.<\/p>\n<h4>Geleneksel Yakla\u015f\u0131mlar\u0131n S\u0131n\u0131rl\u0131l\u0131klar\u0131<\/h4>\n<p>Her metot i\u00e7inde ayr\u0131 ayr\u0131 <code>try-catch<\/code> bloklar\u0131 kullanmak, kod tekrar\u0131na yol a\u00e7ar ve okunabilirli\u011fi d\u00fc\u015f\u00fcr\u00fcr. \u00d6zellikle b\u00fcy\u00fck projelerde, bu yakla\u015f\u0131m s\u00fcrd\u00fcr\u00fclemez hale gelir. Her bir kontrolc\u00fc veya servis katman\u0131nda ayn\u0131 hata i\u015fleme mant\u0131\u011f\u0131n\u0131 tekrarlamak yerine, Spring Boot&#8217;un sundu\u011fu merkezi mekanizmalarla bu s\u00fcreci otomatikle\u015ftirmek \u00e7ok daha verimlidir.<\/p>\n<h4>Spring&#8217;in \u0130stisna Y\u00f6netimi Mekanizmalar\u0131<\/h4>\n<p>Spring Framework, istisna y\u00f6netimi i\u00e7in \u00e7e\u015fitli ara\u00e7lar sunar. Bunlar aras\u0131nda en pop\u00fcler ve g\u00fc\u00e7l\u00fc olan\u0131 <code>@ControllerAdvice<\/code> ve <code>@ExceptionHandler<\/code> anotasyonlar\u0131d\u0131r. Bu anotasyonlar, t\u00fcm kontrolc\u00fclerde veya belirli kontrolc\u00fclerde meydana gelen istisnalar\u0131 tek bir merkezi noktadan ele almam\u0131z\u0131 sa\u011flar.<\/p>\n<h3>@ControllerAdvice ve @ExceptionHandler Kullan\u0131m\u0131<\/h3>\n<p>Spring Boot&#8217;ta k\u00fcresel istisna y\u00f6netiminin kalbinde <code>@ControllerAdvice<\/code> ve <code>@ExceptionHandler<\/code> anotasyonlar\u0131 bulunur. Bu ikili, uygulaman\u0131zdaki t\u00fcm kontrolc\u00fclerden f\u0131rlat\u0131lan istisnalar\u0131 tek bir yerde toplaman\u0131z\u0131 ve \u00f6zel olarak i\u015flemenizi sa\u011flar.<\/p>\n<h4>@ControllerAdvice Nedir?<\/h4>\n<p><code>@ControllerAdvice<\/code> (veya RESTful servisler i\u00e7in <code>@RestControllerAdvice<\/code>), Spring&#8217;in <code>@Controller<\/code> anotasyonlu s\u0131n\u0131flar\u0131na (yani kontrolc\u00fclere) genel bir davran\u0131\u015f eklemek i\u00e7in kullan\u0131lan bir anotasyondur. Bir <code>@ControllerAdvice<\/code> s\u0131n\u0131f\u0131, uygulaman\u0131zdaki t\u00fcm kontrolc\u00fcler i\u00e7in istisna yakalama, veri ba\u011flama veya model niteliklerini y\u00f6netme gibi i\u015flemleri merkezi olarak ger\u00e7ekle\u015ftirebilir. Bir nevi, t\u00fcm kontrolc\u00fcler i\u00e7in bir vekil g\u00f6revi g\u00f6r\u00fcr.<\/p>\n<h4>@ExceptionHandler ile Belirli \u0130stisnalar\u0131 Yakalama<\/h4>\n<p><code>@ExceptionHandler<\/code> anotasyonu, bir <code>@ControllerAdvice<\/code> s\u0131n\u0131f\u0131 i\u00e7inde belirli bir istisna t\u00fcr\u00fcn\u00fc yakalamak i\u00e7in kullan\u0131l\u0131r. Bu anotasyonla i\u015faretlenmi\u015f bir metot, belirtilen istisna f\u0131rlat\u0131ld\u0131\u011f\u0131nda otomatik olarak \u00e7a\u011fr\u0131l\u0131r. Metot, istisnay\u0131 yakalar, uygun bir HTTP durum koduyla bir hata yan\u0131t\u0131 olu\u015fturur ve istemciye geri d\u00f6ner.<\/p>\n<pre><code class=\"language-java\">\nimport org.springframework.http.HttpStatus;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.ControllerAdvice;\nimport org.springframework.web.bind.annotation.ExceptionHandler;\n\n@ControllerAdvice\npublic class GlobalExceptionHandler {\n\n    @ExceptionHandler(ResourceNotFoundException.class)\n    public ResponseEntity<String> handleResourceNotFoundException(ResourceNotFoundException ex) {\n        return new ResponseEntity<\"Kaynak bulunamad\u0131: \" + ex.getMessage(), HttpStatus.NOT_FOUND>();\n    }\n\n    @ExceptionHandler(IllegalArgumentException.class)\n    public ResponseEntity<String> handleIllegalArgumentException(IllegalArgumentException ex) {\n        return new ResponseEntity<\"Ge\u00e7ersiz arg\u00fcman: \" + ex.getMessage(), HttpStatus.BAD_REQUEST>();\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnekte, <code>ResourceNotFoundException<\/code> f\u0131rlat\u0131ld\u0131\u011f\u0131nda <code>handleResourceNotFoundException<\/code> metodu, <code>IllegalArgumentException<\/code> f\u0131rlat\u0131ld\u0131\u011f\u0131nda ise <code>handleIllegalArgumentException<\/code> metodu devreye girer.<\/p>\n<h4>Geni\u015f Kapsaml\u0131 \u0130stisna Yakalama (Exception.class)<\/h4>\n<p>Belirli istisnalar\u0131 yakalaman\u0131n yan\u0131 s\u0131ra, daha genel istisnalar\u0131 da ele alabilirsiniz. <code>Exception.class<\/code> tipindeki istisnalar\u0131 yakalamak, uygulaman\u0131zda \u00f6nceden tan\u0131mlanmam\u0131\u015f veya beklenmedik t\u00fcm di\u011fer istisnalar\u0131 ele almak i\u00e7in \"catch-all\" bir mekanizma sa\u011flar. Bu, uygulaman\u0131z\u0131n beklenmedik bir hata durumunda dahi tutarl\u0131 bir yan\u0131t vermesini garanti eder.<\/p>\n<pre><code class=\"language-java\">\n    \/\/ ... di\u011fer @ExceptionHandler metotlar\u0131 ...\n\n    @ExceptionHandler(Exception.class)\n    public ResponseEntity<String> handleAllUncaughtException(Exception ex) {\n        \/\/ Log the exception for debugging purposes\n        System.err.println(\"Beklenmedik bir hata olu\u015ftu: \" + ex.getMessage());\n        return new ResponseEntity<\"Sunucu hatas\u0131 olu\u015ftu. L\u00fctfen daha sonra tekrar deneyin.\", HttpStatus.INTERNAL_SERVER_ERROR>();\n    }\n<\/pre>\n<p><\/code><\/p>\n<p>Bu metot, \u00f6zel olarak ele al\u0131nmayan t\u00fcm istisnalar\u0131 yakalayarak, kullan\u0131c\u0131ya genel bir hata mesaj\u0131 sunar ve sunucu taraf\u0131nda detayl\u0131 loglama yap\u0131lmas\u0131n\u0131 sa\u011flar.<\/p>\n<h4>Hata Yan\u0131t\u0131 Formatlama (ResponseEntity)<\/h4>\n<p><code>@ExceptionHandler<\/code> metotlar\u0131 genellikle <code>ResponseEntity<\/code> d\u00f6ner. <code>ResponseEntity<\/code>, HTTP yan\u0131t\u0131n\u0131n tamam\u0131n\u0131 (durum kodu, ba\u015fl\u0131klar ve g\u00f6vde) kontrol etmenizi sa\u011flar. Bu sayede, hata durumunda istemciye sadece bir mesaj de\u011fil, ayn\u0131 zamanda uygun bir HTTP durum kodu (\u00f6rne\u011fin, 404 Not Found, 400 Bad Request, 500 Internal Server Error) ve hatta \u00f6zel hata nesneleri g\u00f6nderebilirsiniz.<\/p>\n<h3>\u00d6zel \u0130stisna S\u0131n\u0131flar\u0131 Olu\u015fturma<\/h3>\n<p>Uygulaman\u0131z\u0131n i\u015f mant\u0131\u011f\u0131na \u00f6zg\u00fc hatalar\u0131 daha anlaml\u0131 bir \u015fekilde y\u00f6netmek i\u00e7in \u00f6zel istisna s\u0131n\u0131flar\u0131 olu\u015fturmak iyi bir pratiktir. Bu, kodunuzun daha okunabilir olmas\u0131n\u0131 sa\u011flar ve istisna i\u015fleme mant\u0131\u011f\u0131n\u0131 daha spesifik hale getirir.<\/p>\n<h4>Neden \u00d6zel \u0130stisnalara \u0130htiya\u00e7 Duyar\u0131z?<\/h4>\n<p>Standart Java istisnalar\u0131 (\u00f6rne\u011fin <code>IllegalArgumentException<\/code>, <code>IllegalStateException<\/code>) \u00e7o\u011fu zaman yeterli olsa da, uygulaman\u0131z\u0131n i\u015f kurallar\u0131na \u00f6zg\u00fc hatalar\u0131 ifade etmek i\u00e7in yetersiz kalabilirler. \u00d6rne\u011fin, \"Kullan\u0131c\u0131 bulunamad\u0131\" veya \"Yetersiz bakiye\" gibi durumlar i\u00e7in \u00f6zel istisnalar tan\u0131mlamak, hata mesajlar\u0131n\u0131 daha net hale getirir ve <code>@ExceptionHandler<\/code> metotlar\u0131nda daha spesifik yakalamalar yapman\u0131z\u0131 sa\u011flar.<\/p>\n<h4>RuntimeException'dan T\u00fcretme<\/h4>\n<p>Spring Boot'ta genellikle <code>RuntimeException<\/code> s\u0131n\u0131f\u0131ndan t\u00fcretilen \u00f6zel istisnalar olu\u015fturulur. <code>RuntimeException<\/code>'dan t\u00fcretilen istisnalar \"unchecked\" (i\u015faretlenmemi\u015f) istisnalard\u0131r, yani bunlar\u0131 f\u0131rlatan metotlar\u0131n <code>throws<\/code> anahtar kelimesini kullanmas\u0131 gerekmez. Bu, kod karma\u015f\u0131kl\u0131\u011f\u0131n\u0131 azalt\u0131r.<\/p>\n<pre><code class=\"language-java\">\npublic class ResourceNotFoundException extends RuntimeException {\n    public ResourceNotFoundException(String message) {\n        super(message);\n    }\n}\n\npublic class InsufficientBalanceException extends RuntimeException {\n    public InsufficientBalanceException(String message) {\n        super(message);\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<h4>\u00d6zel Hata Kodlar\u0131 ve Mesajlar\u0131<\/h4>\n<p>\u00d6zel istisna s\u0131n\u0131flar\u0131n\u0131za ek olarak, hata kodlar\u0131 veya ek ba\u011flam bilgileri i\u00e7eren alanlar ekleyebilirsiniz. Bu, istemcinin hatay\u0131 daha iyi anlamas\u0131na ve uygun \u015fekilde tepki vermesine yard\u0131mc\u0131 olabilir.<\/p>\n<pre><code class=\"language-java\">\npublic class CustomValidationException extends RuntimeException {\n    private final String errorCode;\n\n    public CustomValidationException(String message, String errorCode) {\n        super(message);\n        this.errorCode = errorCode;\n    }\n\n    public String getErrorCode() {\n        return errorCode;\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6zel istisnay\u0131 <code>@ControllerAdvice<\/code> i\u00e7inde yakalayarak, hata kodunu da i\u00e7eren zengin bir yan\u0131t olu\u015fturabilirsiniz.<\/p>\n<h3>Hata Detaylar\u0131n\u0131 \u0130stemciye D\u00f6nme<\/h3>\n<p>\u0130stemciye d\u00f6n\u00fclen hata yan\u0131t\u0131n\u0131n sadece bir mesajdan ibaret olmamas\u0131, hatan\u0131n t\u00fcr\u00fc, detaylar\u0131 ve olas\u0131 \u00e7\u00f6z\u00fcmleri hakk\u0131nda bilgi i\u00e7ermesi \u00f6nemlidir. Bu, API'nizin daha kullan\u0131\u015fl\u0131 olmas\u0131n\u0131 sa\u011flar.<\/p>\n<h4>Standart Hata Yan\u0131t\u0131 Yap\u0131s\u0131 (RFC 7807 Problem Details)<\/h4>\n<p>RESTful API'lerde hata yan\u0131tlar\u0131 i\u00e7in RFC 7807 (Problem Details for HTTP APIs) standard\u0131 yayg\u0131n olarak kullan\u0131l\u0131r. Bu standart, hata yan\u0131tlar\u0131 i\u00e7in tutarl\u0131 bir yap\u0131 \u00f6nerir:<\/p>\n<p>*   <code>type<\/code>: Hata t\u00fcr\u00fcn\u00fc tan\u0131mlayan URI (iste\u011fe ba\u011fl\u0131).<br \/>\n*   <code>title<\/code>: \u0130nsan taraf\u0131ndan okunabilir, k\u0131sa bir \u00f6zet.<br \/>\n*   <code>status<\/code>: HTTP durum kodu.<br \/>\n*   <code>detail<\/code>: \u0130nsan taraf\u0131ndan okunabilir, hatan\u0131n spesifik detaylar\u0131.<br \/>\n*   <code>instance<\/code>: Hatan\u0131n meydana geldi\u011fi belirli \u00f6rnek i\u00e7in URI (iste\u011fe ba\u011fl\u0131).<\/p>\n<h4>\u00d6zel Hata Yan\u0131t\u0131 Nesneleri<\/h4>\n<p>Bu standard\u0131 veya kendi \u00f6zel hata yan\u0131t\u0131 yap\u0131n\u0131z\u0131 uygulamak i\u00e7in bir POJO (Plain Old Java Object) s\u0131n\u0131f\u0131 tan\u0131mlayabilirsiniz.<\/p>\n<pre><code class=\"language-java\">\npublic class ErrorResponse {\n    private int status;\n    private String error;\n    private String message;\n    private String path;\n    private long timestamp;\n\n    \/\/ Constructor, getters, setters\n    public ErrorResponse(int status, String error, String message, String path) {\n        this.status = status;\n        this.error = error;\n        this.message = message;\n        this.path = path;\n        this.timestamp = System.currentTimeMillis();\n    }\n\n    \/\/ Getters...\n    public int getStatus() { return status; }\n    public String getError() { return error; }\n    public String getMessage() { return message; }\n    public String getPath() { return path; }\n    public long getTimestamp() { return timestamp; }\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Ard\u0131ndan, <code>@ExceptionHandler<\/code> metotlar\u0131n\u0131zda bu <code>ErrorResponse<\/code> nesnesini kullanabilirsiniz:<\/p>\n<pre><code class=\"language-java\">\nimport org.springframework.http.HttpStatus;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.ControllerAdvice;\nimport org.springframework.web.bind.annotation.ExceptionHandler;\nimport jakarta.servlet.http.HttpServletRequest;\n\n@RestControllerAdvice \/\/ RESTful servisler i\u00e7in daha uygun\npublic class GlobalExceptionHandler {\n\n    @ExceptionHandler(ResourceNotFoundException.class)\n    public ResponseEntity<ErrorResponse> handleResourceNotFound(ResourceNotFoundException ex, HttpServletRequest request) {\n        ErrorResponse error = new ErrorResponse(\n            HttpStatus.NOT_FOUND.value(),\n            HttpStatus.NOT_FOUND.getReasonPhrase(),\n            ex.getMessage(),\n            request.getRequestURI()\n        );\n        return new ResponseEntity<>(error, HttpStatus.NOT_FOUND);\n    }\n\n    @ExceptionHandler(Exception.class)\n    public ResponseEntity<ErrorResponse> handleGenericException(Exception ex, HttpServletRequest request) {\n        ErrorResponse error = new ErrorResponse(\n            HttpStatus.INTERNAL_SERVER_ERROR.value(),\n            HttpStatus.INTERNAL_SERVER_ERROR.getReasonPhrase(),\n            \"Beklenmedik bir hata olu\u015ftu.\",\n            request.getRequestURI()\n        );\n        return new ResponseEntity<>(error, HttpStatus.INTERNAL_SERVER_ERROR);\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<h4>Hata Mesajlar\u0131n\u0131 Yerelle\u015ftirme<\/h4>\n<p>\u00c7ok dilli uygulamalar i\u00e7in hata mesajlar\u0131n\u0131 yerelle\u015ftirmek \u00f6nemlidir. Spring'in <code>MessageSource<\/code> aray\u00fcz\u00fcn\u00fc kullanarak hata mesajlar\u0131n\u0131 farkl\u0131 dillerde sunabilirsiniz. <code>@ControllerAdvice<\/code> i\u00e7inde <code>MessageSource<\/code>'u enjekte edip, istisna mesajlar\u0131n\u0131 bu kaynaktan alarak dinamik olarak \u00e7evirebilirsiniz.<\/p>\n<h3>Veri Do\u011frulama \u0130stisnalar\u0131n\u0131 Y\u00f6netme (@Valid\/@Validated)<\/h3>\n<p>Spring Boot'ta <code>@Valid<\/code> veya <code>@Validated<\/code> anotasyonlar\u0131 ile gelen istek g\u00f6vdelerindeki (request body) verileri do\u011frulamak yayg\u0131n bir senaryodur. Bu do\u011frulama ba\u015far\u0131s\u0131z oldu\u011funda <code>MethodArgumentNotValidException<\/code> istisnas\u0131 f\u0131rlat\u0131l\u0131r. Bu istisnay\u0131 k\u00fcresel olarak ele almak, API'nizin kullan\u0131c\u0131 giri\u015f hatalar\u0131na kar\u015f\u0131 sa\u011flam olmas\u0131n\u0131 sa\u011flar.<\/p>\n<h4>MethodArgumentNotValidException Yakalama<\/h4>\n<p><code>MethodArgumentNotValidException<\/code>, bir metot arg\u00fcman\u0131 <code>@Valid<\/code> veya <code>@Validated<\/code> ile i\u015faretlendi\u011finde ve do\u011frulama kurallar\u0131 ihlal edildi\u011finde f\u0131rlat\u0131l\u0131r. Bu istisnay\u0131 <code>@ControllerAdvice<\/code> i\u00e7inde yakalayarak, do\u011frulama hatalar\u0131n\u0131 istemciye anla\u015f\u0131l\u0131r bir formatta d\u00f6nd\u00fcrebiliriz.<\/p>\n<pre><code class=\"language-java\">\nimport org.springframework.http.HttpStatus;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.validation.FieldError;\nimport org.springframework.web.bind.MethodArgumentNotValidException;\nimport org.springframework.web.bind.annotation.ExceptionHandler;\nimport org.springframework.web.bind.annotation.RestControllerAdvice;\nimport jakarta.servlet.http.HttpServletRequest;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\n@RestControllerAdvice\npublic class GlobalValidationExceptionHandler {\n\n    @ExceptionHandler(MethodArgumentNotValidException.class)\n    public ResponseEntity<Map<String, String>> handleValidationExceptions(\n            MethodArgumentNotValidException ex, HttpServletRequest request) {\n        Map<String, String> errors = new HashMap<>();\n        ex.getBindingResult().getAllErrors().forEach((error) -> {\n            String fieldName = ((FieldError) error).getField();\n            String errorMessage = error.getDefaultMessage();\n            errors.put(fieldName, errorMessage);\n        });\n        return new ResponseEntity<>(errors, HttpStatus.BAD_REQUEST);\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte, <code>MethodArgumentNotValidException<\/code> yakaland\u0131\u011f\u0131nda, t\u00fcm do\u011frulama hatalar\u0131 bir <code>Map<\/code> i\u00e7ine toplan\u0131r ve alan ad\u0131 ile hata mesaj\u0131 e\u015fle\u015fmeleri olarak istemciye geri d\u00f6ner.<\/p>\n<h4>Hata Mesajlar\u0131n\u0131 Anla\u015f\u0131l\u0131r Hale Getirme<\/h4>\n<p>Do\u011frulama hata mesajlar\u0131n\u0131n kullan\u0131c\u0131 dostu olmas\u0131 \u00f6nemlidir. Bean Validation (JSR 380) anotasyonlar\u0131na \u00f6zel mesajlar ekleyerek bu mesajlar\u0131 \u00f6zelle\u015ftirebilirsiniz:<\/p>\n<pre><code class=\"language-java\">\nimport jakarta.validation.constraints.Email;\nimport jakarta.validation.constraints.NotBlank;\nimport jakarta.validation.constraints.Size;\n\npublic class UserDto {\n    @NotBlank(message = \"Kullan\u0131c\u0131 ad\u0131 bo\u015f olamaz\")\n    @Size(min = 3, max = 20, message = \"Kullan\u0131c\u0131 ad\u0131 3 ile 20 karakter aras\u0131nda olmal\u0131d\u0131r\")\n    private String username;\n\n    @Email(message = \"Ge\u00e7erli bir e-posta adresi girin\")\n    @NotBlank(message = \"E-posta bo\u015f olamaz\")\n    private String email;\n\n    \/\/ Getters and Setters\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Bu \u015fekilde, <code>MethodArgumentNotValidException<\/code> yakaland\u0131\u011f\u0131nda, istemciye do\u011frudan bu \u00f6zelle\u015ftirilmi\u015f mesajlar d\u00f6necektir.<\/p>\n<h4>Tek Bir Hata Yan\u0131t\u0131nda Birden Fazla Do\u011frulama Hatas\u0131<\/h4>\n<p>Yukar\u0131daki <code>handleValidationExceptions<\/code> metodu, birden fazla do\u011frulama hatas\u0131n\u0131 tek bir JSON yan\u0131t\u0131nda d\u00f6nd\u00fcrerek istemcinin t\u00fcm hatalar\u0131 ayn\u0131 anda g\u00f6rmesini sa\u011flar. Bu, kullan\u0131c\u0131 deneyimini iyile\u015ftirir \u00e7\u00fcnk\u00fc kullan\u0131c\u0131 her bir hatay\u0131 d\u00fczeltmek i\u00e7in ayr\u0131 ayr\u0131 istek g\u00f6ndermek zorunda kalmaz.<\/p>\n<h3>Spring G\u00fcvenlik \u0130stisnalar\u0131 ve Di\u011fer \u00d6zel Durumlar<\/h3>\n<p>Spring Boot uygulamalar\u0131nda sadece i\u015f mant\u0131\u011f\u0131na ait istisnalar de\u011fil, ayn\u0131 zamanda g\u00fcvenlik, a\u011f veya uygulama altyap\u0131s\u0131yla ilgili \u00e7e\u015fitli istisnalar da ortaya \u00e7\u0131kabilir. Bu istisnalar\u0131 da k\u00fcresel olarak ele almak, uygulaman\u0131n genel sa\u011flaml\u0131\u011f\u0131n\u0131 art\u0131r\u0131r.<\/p>\n<h4>AccessDeniedException ve AuthenticationException<\/h4>\n<p>Spring Security kullan\u0131yorsan\u0131z, yetkilendirme veya kimlik do\u011frulama hatalar\u0131 \u00f6zel istisnalar olarak f\u0131rlat\u0131l\u0131r:<\/p>\n<p>*   <code>AuthenticationException<\/code>: Kullan\u0131c\u0131 kimlik do\u011frulama ba\u015far\u0131s\u0131z oldu\u011funda (\u00f6rn. yanl\u0131\u015f parola). Genellikle 401 Unauthorized durum kodu ile e\u015fle\u015fir.<br \/>\n*   <code>AccessDeniedException<\/code>: Kullan\u0131c\u0131n\u0131n belirli bir kayna\u011fa eri\u015fim yetkisi olmad\u0131\u011f\u0131nda f\u0131rlat\u0131l\u0131r. Genellikle 403 Forbidden durum kodu ile e\u015fle\u015fir.<\/p>\n<p>Bu istisnalar\u0131 <code>@ControllerAdvice<\/code> i\u00e7inde yakalayarak, g\u00fcvenlik hatalar\u0131na \u00f6zel yan\u0131tlar verebilirsiniz. Ancak, Spring Security'nin kendi istisna i\u015fleme mekanizmalar\u0131 (\u00f6rne\u011fin <code>AuthenticationEntryPoint<\/code> ve <code>AccessDeniedHandler<\/code>) genellikle daha uygun bir yakla\u015f\u0131md\u0131r.<\/p>\n<h4>NoHandlerFoundException ve AsyncRequestTimeoutException<\/h4>\n<p>Spring MVC'nin varsay\u0131lan istisna i\u015fleme mekanizmalar\u0131n\u0131n yakalayamad\u0131\u011f\u0131 baz\u0131 istisnalar da vard\u0131r:<\/p>\n<p>*   <code>NoHandlerFoundException<\/code>: \u0130stemcinin istedi\u011fi bir URL i\u00e7in uygun bir kontrolc\u00fc metodu bulunamad\u0131\u011f\u0131nda f\u0131rlat\u0131l\u0131r (404 Not Found). Bu istisnay\u0131 yakalamak i\u00e7in <code>spring.mvc.throw-exception-if-no-handler-found=true<\/code> ve <code>spring.web.resources.add-mappings=false<\/code> \u00f6zelliklerini <code>application.properties<\/code> dosyan\u0131zda etkinle\u015ftirmeniz gerekebilir.<br \/>\n*   <code>AsyncRequestTimeoutException<\/code>: Asenkron bir iste\u011fin zaman a\u015f\u0131m\u0131na u\u011framas\u0131 durumunda f\u0131rlat\u0131l\u0131r.<\/p>\n<p>Bu istisnalar\u0131 da genel hata y\u00f6neticinize ekleyerek tutarl\u0131 404 veya 503 (Service Unavailable) yan\u0131tlar\u0131 sa\u011flayabilirsiniz.<\/p>\n<h4>Di\u011fer S\u0131k Kar\u015f\u0131la\u015f\u0131lan \u0130stisnalar<\/h4>\n<p>A\u015fa\u011f\u0131daki tabloda, Spring Boot uygulamalar\u0131nda s\u0131k\u00e7a kar\u015f\u0131la\u015f\u0131lan baz\u0131 istisnalar ve bunlara kar\u015f\u0131l\u0131k gelen tipik HTTP durum kodlar\u0131 listelenmi\u015ftir:<\/p>\n<table>\n<thead>\n<tr>\n<th>\u0130stisna T\u00fcr\u00fc<\/th>\n<th>Tipik HTTP Durum Kodu<\/th>\n<th>A\u00e7\u0131klama<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>ResourceNotFoundException<\/code> (\u00d6zel)<\/td>\n<td>404 Not Found<\/td>\n<td>\u0130stenen kaynak bulunamad\u0131.<\/td>\n<\/tr>\n<tr>\n<td><code>IllegalArgumentException<\/code><\/td>\n<td>400 Bad Request<\/td>\n<td>Metoda ge\u00e7ersiz bir arg\u00fcman verildi.<\/td>\n<\/tr>\n<tr>\n<td><code>IllegalStateException<\/code><\/td>\n<td>400 Bad Request \/ 500 Internal Server Error<\/td>\n<td>Nesne ge\u00e7ersiz bir durumda.<\/td>\n<\/tr>\n<tr>\n<td><code>DataIntegrityViolationException<\/code><\/td>\n<td>409 Conflict \/ 400 Bad Request<\/td>\n<td>Veritaban\u0131 b\u00fct\u00fcnl\u00fc\u011f\u00fc ihlali (\u00f6rn. benzersizlik k\u0131s\u0131tlamas\u0131).<\/td>\n<\/tr>\n<tr>\n<td><code>MethodArgumentNotValidException<\/code><\/td>\n<td>400 Bad Request<\/td>\n<td>\u0130stek g\u00f6vdesindeki veri do\u011frulama hatas\u0131.<\/td>\n<\/tr>\n<tr>\n<td><code>HttpRequestMethodNotSupportedException<\/code><\/td>\n<td>405 Method Not Allowed<\/td>\n<td>\u0130stek i\u00e7in HTTP metodu desteklenmiyor.<\/td>\n<\/tr>\n<tr>\n<td><code>HttpMediaTypeNotSupportedException<\/code><\/td>\n<td>415 Unsupported Media Type<\/td>\n<td>\u0130stek g\u00f6vdesi medya t\u00fcr\u00fc desteklenmiyor.<\/td>\n<\/tr>\n<tr>\n<td><code>NoHandlerFoundException<\/code><\/td>\n<td>404 Not Found<\/td>\n<td>\u0130stenen URL i\u00e7in bir kontrolc\u00fc bulunamad\u0131.<\/td>\n<\/tr>\n<tr>\n<td><code>AccessDeniedException<\/code><\/td>\n<td>403 Forbidden<\/td>\n<td>Kullan\u0131c\u0131n\u0131n eri\u015fim yetkisi yok.<\/td>\n<\/tr>\n<tr>\n<td><code>AuthenticationException<\/code><\/td>\n<td>401 Unauthorized<\/td>\n<td>Kimlik do\u011frulama ba\u015far\u0131s\u0131z oldu.<\/td>\n<\/tr>\n<tr>\n<td><code>Exception<\/code> (Genel)<\/td>\n<td>500 Internal Server Error<\/td>\n<td>Beklenmedik genel bir hata.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Bu tablo, yayg\u0131n istisnalar i\u00e7in h\u0131zl\u0131 bir ba\u015fvuru noktas\u0131 sunar ve k\u00fcresel hata y\u00f6neticinizi tasarlarken size yol g\u00f6sterebilir.<\/p>\n<h3>Sonu\u00e7 B\u00f6l\u00fcm\u00fc<\/h3>\n<p>Spring Boot'ta k\u00fcresel istisna y\u00f6netimi, modern ve sa\u011flam bir API geli\u015ftirmenin temel ta\u015flar\u0131ndan biridir. <code>@ControllerAdvice<\/code> ve <code>@ExceptionHandler<\/code> mekanizmalar\u0131 sayesinde, uygulaman\u0131zdaki t\u00fcm istisnalar\u0131 merkezi bir noktadan ele alabilir, kod tekrar\u0131n\u0131 \u00f6nleyebilir ve tutarl\u0131 hata yan\u0131tlar\u0131 \u00fcretebilirsiniz. \u00d6zel istisna s\u0131n\u0131flar\u0131 olu\u015fturmak, hata yan\u0131tlar\u0131n\u0131 RFC 7807 gibi standartlara uygun hale getirmek ve veri do\u011frulama hatalar\u0131n\u0131 detayl\u0131 bir \u015fekilde sunmak, uygulaman\u0131z\u0131n hem geli\u015ftiriciler hem de son kullan\u0131c\u0131lar i\u00e7in daha anla\u015f\u0131l\u0131r ve y\u00f6netilebilir olmas\u0131n\u0131 sa\u011flar. Unutmay\u0131n, iyi bir istisna y\u00f6netimi stratejisi sadece hatalar\u0131 gizlemekle kalmaz, ayn\u0131 zamanda uygulaman\u0131z\u0131n g\u00fcvenilirli\u011fini ve kullan\u0131c\u0131 deneyimini de \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r.<\/p>\n<h3>SSS (S\u0131k Sorulan Sorular)<\/h3>\n<h4>@ControllerAdvice ile @RestControllerAdvice Aras\u0131ndaki Fark Nedir?<\/h4>\n<p><code>@ControllerAdvice<\/code>, <code>@Controller<\/code> anotasyonlu s\u0131n\u0131flar i\u00e7in genel istisna y\u00f6netimi, veri ba\u011flama veya model nitelikleri gibi i\u015flemleri merkezi olarak sa\u011flamak i\u00e7in kullan\u0131l\u0131r. <code>@RestControllerAdvice<\/code> ise <code>@ControllerAdvice<\/code>'\u0131n \u00f6zel bir versiyonudur ve otomatik olarak <code>@ResponseBody<\/code> davran\u0131\u015f\u0131n\u0131 i\u00e7erir. Bu, metotlar\u0131n d\u00f6nd\u00fcrd\u00fc\u011f\u00fc de\u011ferlerin do\u011frudan HTTP yan\u0131t g\u00f6vdesine d\u00f6n\u00fc\u015ft\u00fcr\u00fclece\u011fi anlam\u0131na gelir, bu da RESTful API'ler i\u00e7in idealdir. \u00c7o\u011fu RESTful Spring Boot uygulamas\u0131 i\u00e7in <code>@RestControllerAdvice<\/code> kullanmak daha uygun olacakt\u0131r.<\/p>\n<h4>\u0130stisna Detaylar\u0131n\u0131 Loglamak Neden \u00d6nemlidir?<\/h4>\n<p>\u0130stisna detaylar\u0131n\u0131 (stack trace dahil) sunucu taraf\u0131nda loglamak, hatalar\u0131n k\u00f6k nedenini bulmak ve uygulamadaki sorunlar\u0131 gidermek i\u00e7in kritik \u00f6neme sahiptir. Kullan\u0131c\u0131ya genel bir hata mesaj\u0131 d\u00f6nerken, arka planda loglanan detaylar geli\u015ftiricilerin sorunu h\u0131zl\u0131ca tespit etmesine yard\u0131mc\u0131 olur. Hassas bilgilerin (\u00f6rn. veritaban\u0131 \u015fifreleri) loglara s\u0131zmad\u0131\u011f\u0131ndan emin olmak \u00f6nemlidir.<\/p>\n<h4>Hata Mesajlar\u0131n\u0131 Kullan\u0131c\u0131lara Nas\u0131l G\u00f6stermeliyim?<\/h4>\n<p>Kullan\u0131c\u0131lara g\u00f6sterilen hata mesajlar\u0131, teknik detaylardan ar\u0131nd\u0131r\u0131lm\u0131\u015f, anla\u015f\u0131l\u0131r ve eyleme d\u00f6n\u00fc\u015ft\u00fcr\u00fclebilir olmal\u0131d\u0131r. \u00d6rne\u011fin, bir veritaban\u0131 hatas\u0131 yerine \"\u0130\u015flem tamamlanamad\u0131, l\u00fctfen daha sonra tekrar deneyin\" gibi genel bir mesaj tercih edilmelidir. Do\u011frulama hatalar\u0131 gibi kullan\u0131c\u0131 girdisine ba\u011fl\u0131 hatalar i\u00e7in ise \"E-posta adresi ge\u00e7ersiz\" gibi spesifik ve y\u00f6nlendirici mesajlar verilmelidir.<\/p>\n<h4>Farkl\u0131 Ortamlar \u0130\u00e7in (Dev\/Prod) Farkl\u0131 Hata Yan\u0131tlar\u0131 Nas\u0131l Y\u00f6netilir?<\/h4>\n<p>Geli\u015ftirme ortam\u0131nda (Dev), istisna detaylar\u0131n\u0131 (stack trace dahil) istemciye d\u00f6nd\u00fcrmek hata ay\u0131klamay\u0131 kolayla\u015ft\u0131rabilir. Ancak \u00fcretim ortam\u0131nda (Prod), bu t\u00fcr detaylar g\u00fcvenlik riski olu\u015fturabilir ve kullan\u0131c\u0131 deneyimini k\u00f6t\u00fcle\u015ftirebilir. Bu durumu y\u00f6netmek i\u00e7in, <code>@ControllerAdvice<\/code> i\u00e7indeki <code>@ExceptionHandler<\/code> metotlar\u0131n\u0131zda Spring'in <code>Environment<\/code> nesnesini enjekte edebilir ve mevcut profilin (\u00f6rne\u011fin \"dev\" veya \"prod\") ne oldu\u011funa g\u00f6re farkl\u0131 yan\u0131tlar olu\u015fturabilirsiniz. Alternatif olarak, <code>application.properties<\/code> veya <code>application-prod.properties<\/code> gibi dosyalarda farkl\u0131 hata ay\u0131klama seviyeleri tan\u0131mlayabilirsiniz.<\/p>\n","protected":false},"excerpt":{"rendered":"Spring Boot&#8217;ta K\u00fcresel \u0130stisna Y\u00f6netimi: En \u0130yi Uygulamalar\nModern web uygulamalar\u0131nda istisna y\u00f6netimi, kullan\u0131c\u0131 deneyimini do\u011frudan etkileyen ve&#8230;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-36664","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Spring Boot&#039;ta K\u00fcresel \u0130stisna Y\u00f6netimi: En \u0130yi Uygulamalar - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/spring-bootta-kuresel-istisna-yonetimi-en-iyi-uygulamalar\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Spring Boot&#039;ta K\u00fcresel \u0130stisna Y\u00f6netimi: En \u0130yi Uygulamalar\" \/>\n<meta property=\"og:description\" content=\"Spring Boot&#039;ta K\u00fcresel \u0130stisna Y\u00f6netimi: En \u0130yi Uygulamalar Modern web uygulamalar\u0131nda istisna y\u00f6netimi, kullan\u0131c\u0131 deneyimini do\u011frudan etkileyen ve...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/spring-bootta-kuresel-istisna-yonetimi-en-iyi-uygulamalar\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-21T07:00:36+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"14 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/spring-bootta-kuresel-istisna-yonetimi-en-iyi-uygulamalar\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/spring-bootta-kuresel-istisna-yonetimi-en-iyi-uygulamalar\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Spring Boot&#8217;ta K\u00fcresel \u0130stisna Y\u00f6netimi: En \u0130yi Uygulamalar\",\"datePublished\":\"2025-12-21T07:00:36+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/spring-bootta-kuresel-istisna-yonetimi-en-iyi-uygulamalar\/\"},\"wordCount\":2278,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/spring-bootta-kuresel-istisna-yonetimi-en-iyi-uygulamalar\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/spring-bootta-kuresel-istisna-yonetimi-en-iyi-uygulamalar\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/spring-bootta-kuresel-istisna-yonetimi-en-iyi-uygulamalar\/\",\"name\":\"Spring Boot'ta K\u00fcresel \u0130stisna Y\u00f6netimi: En \u0130yi Uygulamalar - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-12-21T07:00:36+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/spring-bootta-kuresel-istisna-yonetimi-en-iyi-uygulamalar\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/spring-bootta-kuresel-istisna-yonetimi-en-iyi-uygulamalar\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/spring-bootta-kuresel-istisna-yonetimi-en-iyi-uygulamalar\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Spring Boot&#8217;ta K\u00fcresel \u0130stisna Y\u00f6netimi: En \u0130yi Uygulamalar\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Spring Boot'ta K\u00fcresel \u0130stisna Y\u00f6netimi: En \u0130yi Uygulamalar - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/spring-bootta-kuresel-istisna-yonetimi-en-iyi-uygulamalar\/","og_locale":"tr_TR","og_type":"article","og_title":"Spring Boot'ta K\u00fcresel \u0130stisna Y\u00f6netimi: En \u0130yi Uygulamalar","og_description":"Spring Boot'ta K\u00fcresel \u0130stisna Y\u00f6netimi: En \u0130yi Uygulamalar Modern web uygulamalar\u0131nda istisna y\u00f6netimi, kullan\u0131c\u0131 deneyimini do\u011frudan etkileyen ve...","og_url":"https:\/\/fatihsoysal.com\/blog\/spring-bootta-kuresel-istisna-yonetimi-en-iyi-uygulamalar\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-12-21T07:00:36+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"14 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/spring-bootta-kuresel-istisna-yonetimi-en-iyi-uygulamalar\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/spring-bootta-kuresel-istisna-yonetimi-en-iyi-uygulamalar\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Spring Boot&#8217;ta K\u00fcresel \u0130stisna Y\u00f6netimi: En \u0130yi Uygulamalar","datePublished":"2025-12-21T07:00:36+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/spring-bootta-kuresel-istisna-yonetimi-en-iyi-uygulamalar\/"},"wordCount":2278,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/spring-bootta-kuresel-istisna-yonetimi-en-iyi-uygulamalar\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/spring-bootta-kuresel-istisna-yonetimi-en-iyi-uygulamalar\/","url":"https:\/\/fatihsoysal.com\/blog\/spring-bootta-kuresel-istisna-yonetimi-en-iyi-uygulamalar\/","name":"Spring Boot'ta K\u00fcresel \u0130stisna Y\u00f6netimi: En \u0130yi Uygulamalar - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-12-21T07:00:36+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/spring-bootta-kuresel-istisna-yonetimi-en-iyi-uygulamalar\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/spring-bootta-kuresel-istisna-yonetimi-en-iyi-uygulamalar\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/spring-bootta-kuresel-istisna-yonetimi-en-iyi-uygulamalar\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Spring Boot&#8217;ta K\u00fcresel \u0130stisna Y\u00f6netimi: En \u0130yi Uygulamalar"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36664","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=36664"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36664\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=36664"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=36664"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=36664"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}