{"id":37258,"date":"2025-12-29T14:41:41","date_gmt":"2025-12-29T11:41:41","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=37258"},"modified":"2025-12-29T14:41:41","modified_gmt":"2025-12-29T11:41:41","slug":"spring-validasyon-ornegi-spring-mvc-form-validator","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/spring-validasyon-ornegi-spring-mvc-form-validator\/","title":{"rendered":"Spring Validasyon \u00d6rne\u011fi &#8211; Spring MVC Form Validator"},"content":{"rendered":"<p><body><\/p>\n<div style=\"font-family: Arial, sans-serif; line-height: 1.6;\">\n<h2>Spring Validasyon \u00d6rne\u011fi &#8211; Spring MVC Form Validator<\/h2>\n<p>Web uygulamalar\u0131n\u0131n geli\u015ftirilmesinde, kullan\u0131c\u0131dan al\u0131nan verilerin do\u011frulu\u011funu ve b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc sa\u011flamak kritik bir \u00f6neme sahiptir. Ge\u00e7ersiz veya k\u00f6t\u00fc niyetli veriler, uygulaman\u0131n \u00e7\u00f6kmesine, g\u00fcvenlik a\u00e7\u0131klar\u0131na veya yanl\u0131\u015f i\u015f mant\u0131\u011f\u0131 y\u00fcr\u00fct\u00fclmesine neden olabilir. Spring Framework, bu ihtiyac\u0131 kar\u015f\u0131lamak \u00fczere g\u00fc\u00e7l\u00fc ve esnek bir validasyon mekanizmas\u0131 sunar. Bu rehberde, Spring MVC uygulamalar\u0131nda form verilerini nas\u0131l do\u011frulayaca\u011f\u0131m\u0131z\u0131, Bean Validation API&#8217;sini (JSR 380) Spring ile nas\u0131l entegre edece\u011fimizi ve pratik bir \u00f6rnek \u00fczerinden ad\u0131m ad\u0131m nas\u0131l uygulayaca\u011f\u0131m\u0131z\u0131 \u00f6\u011frenece\u011fiz.<\/p>\n<h3>Giri\u015f: Neden Validasyon Gereklidir?<\/h3>\n<p>Validasyon, kullan\u0131c\u0131dan gelen girdilerin belirli kurallara uygun olup olmad\u0131\u011f\u0131n\u0131 kontrol etme i\u015flemidir. Bu kurallar, veri tipinden (say\u0131, metin, tarih), uzunluk k\u0131s\u0131tlamalar\u0131na, belirli bir formata (e-posta, telefon numaras\u0131) veya i\u015f mant\u0131\u011f\u0131na \u00f6zg\u00fc ko\u015fullara kadar geni\u015f bir yelpazeyi kapsayabilir. Spring MVC uygulamalar\u0131nda, formlar arac\u0131l\u0131\u011f\u0131yla kullan\u0131c\u0131dan al\u0131nan verilerin sunucu taraf\u0131nda do\u011frulanmas\u0131, yaln\u0131zca kullan\u0131c\u0131 deneyimini iyile\u015ftirmekle kalmaz, ayn\u0131 zamanda uygulaman\u0131n g\u00fcvenli\u011fini ve kararl\u0131l\u0131\u011f\u0131n\u0131 da art\u0131r\u0131r. Client-side (taray\u0131c\u0131 taraf\u0131) validasyon genellikle kullan\u0131c\u0131ya anl\u0131k geri bildirim sa\u011flamak i\u00e7in kullan\u0131l\u0131rken, sunucu taraf\u0131 validasyon g\u00fcvenlik ve veri b\u00fct\u00fcnl\u00fc\u011f\u00fc i\u00e7in vazge\u00e7ilmezdir; \u00e7\u00fcnk\u00fc client-side validasyon kolayca atlat\u0131labilir.<\/p>\n<h3>Spring Validasyon Mekanizmas\u0131na Genel Bak\u0131\u015f<\/h3>\n<p>Spring, validasyon i\u00e7in \u00f6ncelikle Java EE&#8217;nin standart validasyon API&#8217;si olan <a href=\"https:\/\/beanvalidation.org\/\" target=\"_blank\">Bean Validation API<\/a>&#8216;sini (JSR 380, \u00f6nceki ad\u0131yla JSR 303) kullan\u0131r. Hibernate Validator ise bu API&#8217;nin referans implementasyonudur ve genellikle Spring Boot projelerinde otomatik olarak ba\u011f\u0131ml\u0131l\u0131k olarak eklenir.<\/p>\n<h4>Bean Validation API Annotasyonlar\u0131<\/h4>\n<p>Bean Validation API, bir model s\u0131n\u0131f\u0131n\u0131n alanlar\u0131na do\u011frudan uygulanabilen bir dizi haz\u0131r annotasyon sunar. En s\u0131k kullan\u0131lanlardan baz\u0131lar\u0131 \u015funlard\u0131r:<\/p>\n<ul>\n<li><code>@NotNull<\/code>: Alan\u0131n null olmamas\u0131n\u0131 sa\u011flar.<\/li>\n<li><code>@NotEmpty<\/code>: String, Collection veya Map&#8217;in bo\u015f olmamas\u0131n\u0131 sa\u011flar (bo\u015f string veya bo\u015f koleksiyon).<\/li>\n<li><code>@NotBlank<\/code>: String&#8217;in null olmamas\u0131n\u0131 ve en az bir bo\u015fluk d\u0131\u015f\u0131 karakter i\u00e7ermesini sa\u011flar.<\/li>\n<li><code>@Size(min, max)<\/code>: String, Collection veya Array&#8217;in boyutunu kontrol eder.<\/li>\n<li><code>@Min(value)<\/code>, <code>@Max(value)<\/code>: Say\u0131sal de\u011ferler i\u00e7in minimum ve maksimum de\u011ferleri belirler.<\/li>\n<li><code>@Email<\/code>: Alan\u0131n ge\u00e7erli bir e-posta format\u0131nda olmas\u0131n\u0131 sa\u011flar.<\/li>\n<li><code>@Pattern(regexp)<\/code>: D\u00fczenli ifade (regex) kullanarak alan\u0131n belirli bir desene uymas\u0131n\u0131 sa\u011flar.<\/li>\n<li><code>@Past<\/code>, <code>@Future<\/code>: Tarih alanlar\u0131n\u0131n ge\u00e7mi\u015fte veya gelecekte olmas\u0131n\u0131 sa\u011flar.<\/li>\n<\/ul>\n<h4>Spring&#8217;in Bean Validation Entegrasyonu<\/h4>\n<p>Spring MVC, controller metotlar\u0131nda kullan\u0131lan model nesnelerine uygulanan bu annotasyonlar\u0131 otomatik olarak alg\u0131lar ve do\u011frulama i\u015flemini tetikler. Bu entegrasyon i\u00e7in anahtar bile\u015fenler \u015funlard\u0131r:<\/p>\n<ul>\n<li><code>@Valid<\/code> veya <code>@Validated<\/code> annotasyonlar\u0131: Controller metotlar\u0131nda bir model nesnesinin do\u011frulanmas\u0131 gerekti\u011fini belirtmek i\u00e7in kullan\u0131l\u0131r.<\/li>\n<li><code>BindingResult<\/code>: Do\u011frulama sonu\u00e7lar\u0131n\u0131 (hatalar\u0131) tutan bir nesnedir. Bu nesne, controller metot parametresi olarak <code>@Valid<\/code> veya <code>@Validated<\/code> annotasyonlu model nesnesinden hemen sonra gelmelidir.<\/li>\n<li><code>WebDataBinder<\/code>: Spring&#8217;in form verilerini model nesnelerine ba\u011flamak i\u00e7in kulland\u0131\u011f\u0131 mekanizmad\u0131r. Ayn\u0131 zamanda validat\u00f6rleri kaydetmek i\u00e7in de kullan\u0131labilir.<\/li>\n<\/ul>\n<h3>\u00d6rnek Uygulama Geli\u015ftirme<\/h3>\n<p>\u015eimdi pratik bir \u00f6rnek \u00fczerinden Spring MVC form validasyonunu ad\u0131m ad\u0131m inceleyelim. Bir kullan\u0131c\u0131 kay\u0131t formu olu\u015fturacak ve bu formdaki alanlar\u0131 do\u011frulayaca\u011f\u0131z.<\/p>\n<h4>1. Proje Kurulumu<\/h4>\n<p>Yeni bir Spring Boot projesi olu\u015ftururken veya mevcut bir projeye eklerken a\u015fa\u011f\u0131daki ba\u011f\u0131ml\u0131l\u0131klar\u0131 <code>pom.xml<\/code> dosyan\u0131za eklemeniz gerekmektedir:<\/p>\n<pre><code class=\"language-xml\">\n<dependencies>\n    <!-- Spring Web i\u00e7in -->\n    <dependency>\n        <groupId>org.springframework.boot<\/groupId>\n        <artifactId>spring-boot-starter-web<\/artifactId>\n    <\/dependency>\n    <!-- Bean Validation API ve Hibernate Validator i\u00e7in -->\n    <dependency>\n        <groupId>org.springframework.boot<\/groupId>\n        <artifactId>spring-boot-starter-validation<\/artifactId>\n    <\/dependency>\n    <!-- Thymeleaf \u015fablon motoru i\u00e7in (iste\u011fe ba\u011fl\u0131, ba\u015fka bir \u015fablon motoru da kullanabilirsiniz) -->\n    <dependency>\n        <groupId>org.springframework.boot<\/groupId>\n        <artifactId>spring-boot-starter-thymeleaf<\/artifactId>\n    <\/dependency>\n<\/dependencies>\n<\/code><\/pre>\n<h4>2. Model S\u0131n\u0131f\u0131 Olu\u015fturma (User DTO)<\/h4>\n<p>Kullan\u0131c\u0131 kay\u0131t formumuz i\u00e7in bir DTO (Data Transfer Object) veya model s\u0131n\u0131f\u0131 olu\u015ftural\u0131m ve Bean Validation annotasyonlar\u0131n\u0131 uygulayal\u0131m:<\/p>\n<pre><code class=\"language-java\">\npackage com.example.validationdemo.model;\n\nimport javax.validation.constraints.Email;\nimport javax.validation.constraints.NotBlank;\nimport javax.validation.constraints.Size;\nimport javax.validation.constraints.Min;\nimport javax.validation.constraints.Max;\n\npublic class User {\n\n    @NotBlank(message = \"Kullan\u0131c\u0131 ad\u0131 bo\u015f b\u0131rak\u0131lamaz.\")\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    @NotBlank(message = \"E-posta bo\u015f b\u0131rak\u0131lamaz.\")\n    @Email(message = \"Ge\u00e7erli bir e-posta adresi giriniz.\")\n    private String email;\n\n    @NotBlank(message = \"\u015eifre bo\u015f b\u0131rak\u0131lamaz.\")\n    @Size(min = 6, message = \"\u015eifre en az 6 karakter olmal\u0131d\u0131r.\")\n    private String password;\n\n    @Min(value = 18, message = \"Ya\u015f\u0131n\u0131z en az 18 olmal\u0131d\u0131r.\")\n    @Max(value = 100, message = \"Ya\u015f\u0131n\u0131z 100'den b\u00fcy\u00fck olamaz.\")\n    private int age;\n\n    \/\/ Getter ve Setter metotlar\u0131\n    public String getUsername() { return username; }\n    public void setUsername(String username) { this.username = username; }\n    public String getEmail() { return email; }\n    public void setEmail(String email) { this.email = email; }\n    public String getPassword() { return password; }\n    public void setPassword(String password) { this.password = password; }\n    public int getAge() { return age; }\n    public void setAge(int age) { this.age = age; }\n}\n<\/code><\/pre>\n<p>G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi, her alan i\u00e7in uygun validasyon annotasyonlar\u0131n\u0131 ve hata mesajlar\u0131n\u0131 do\u011frudan model s\u0131n\u0131f\u0131 \u00fczerinde tan\u0131mlad\u0131k.<\/p>\n<h4>3. Controller S\u0131n\u0131f\u0131 Olu\u015fturma<\/h4>\n<p>\u015eimdi bu <code>User<\/code> modelini kullanan bir Spring MVC Controller s\u0131n\u0131f\u0131 olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-java\">\npackage com.example.validationdemo.controller;\n\nimport com.example.validationdemo.model.User;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.ui.Model;\nimport org.springframework.validation.BindingResult;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.ModelAttribute;\nimport org.springframework.web.bind.annotation.PostMapping;\n\nimport javax.validation.Valid;\n\n@Controller\npublic class UserController {\n\n    @GetMapping(\"\/register\")\n    public String showRegistrationForm(Model model) {\n        model.addAttribute(\"user\", new User());\n        return \"user-form\"; \/\/ user-form.html \u015fablonunu d\u00f6ner\n    }\n\n    @PostMapping(\"\/register\")\n    public String processRegistrationForm(\n            @ModelAttribute(\"user\") @Valid User user,\n            BindingResult bindingResult,\n            Model model) {\n\n        if (bindingResult.hasErrors()) {\n            \/\/ Validasyon hatalar\u0131 varsa, formu tekrar g\u00f6ster\n            return \"user-form\";\n        }\n\n        \/\/ Validasyon ba\u015far\u0131l\u0131 ise, kullan\u0131c\u0131y\u0131 kaydetme veya ba\u015fka bir sayfaya y\u00f6nlendirme\n        \/\/ \u00d6rne\u011fin: userService.saveUser(user);\n        model.addAttribute(\"message\", \"Kay\u0131t Ba\u015far\u0131l\u0131! Ho\u015f geldiniz, \" + user.getUsername());\n        return \"success\"; \/\/ success.html \u015fablonunu d\u00f6ner\n    }\n}\n<\/code><\/pre>\n<p>Yukar\u0131daki controller&#8217;da dikkat edilmesi gerekenler:<\/p>\n<ul>\n<li><code>showRegistrationForm<\/code> metodu, formu g\u00f6stermek i\u00e7in bo\u015f bir <code>User<\/code> nesnesini modele ekler.<\/li>\n<li><code>processRegistrationForm<\/code> metodu, form g\u00f6nderildi\u011finde \u00e7al\u0131\u015f\u0131r.<\/li>\n<li><code>@ModelAttribute(\"user\")<\/code>: Gelen form verilerini <code>User<\/code> nesnesine ba\u011flar.<\/li>\n<li><code>@Valid User user<\/code>: Spring&#8217;e bu <code>User<\/code> nesnesinin Bean Validation kurallar\u0131na g\u00f6re do\u011frulanmas\u0131 gerekti\u011fini s\u00f6yler.<\/li>\n<li><code>BindingResult bindingResult<\/code>: Do\u011frulama sonu\u00e7lar\u0131n\u0131 tutar. <code>@Valid<\/code> annotasyonundan hemen sonra gelmesi ZORUNLUDUR. Aksi takdirde, validasyon hatas\u0131 oldu\u011funda Spring bir istisna f\u0131rlat\u0131r.<\/li>\n<li><code>bindingResult.hasErrors()<\/code>: Validasyon hatalar\u0131 olup olmad\u0131\u011f\u0131n\u0131 kontrol eder. Hata varsa, kullan\u0131c\u0131 ayn\u0131 sayfaya geri y\u00f6nlendirilir ve hatalar g\u00f6sterilir.<\/li>\n<\/ul>\n<h4>4. View Katman\u0131 Olu\u015fturma (Thymeleaf)<\/h4>\n<p>\u015eimdi <code>user-form.html<\/code> ve <code>success.html<\/code> ad\u0131nda iki Thymeleaf \u015fablonu olu\u015ftural\u0131m. Bunlar\u0131 <code>src\/main\/resources\/templates\/<\/code> dizinine koymal\u0131s\u0131n\u0131z.<\/p>\n<p><strong><code>user-form.html<\/code>:<\/strong><\/p>\n<pre><code class=\"language-html\">\n<!DOCTYPE html>\n<html xmlns:th=\"http:\/\/www.thymeleaf.org\">\n<head>\n    <title>Kullan\u0131c\u0131 Kay\u0131t Formu<\/title>\n    <style>\n        .error { color: red; font-size: 0.9em; }\n        body { font-family: Arial, sans-serif; margin: 20px; }\n        form div { margin-bottom: 10px; }\n        label { display: inline-block; width: 100px; }\n        input[type=\"text\"], input[type=\"password\"], input[type=\"email\"] { width: 200px; padding: 5px; }\n        button { padding: 8px 15px; }\n    <\/style>\n<\/head>\n<body>\n    <h2>Kullan\u0131c\u0131 Kay\u0131t Formu<\/h2>\n    <form th:action=\"@{\/register}\" th:object=\"${user}\" method=\"post\">\n        <div>\n            <label for=\"username\">Kullan\u0131c\u0131 Ad\u0131:<\/label>\n            <input type=\"text\" id=\"username\" th:field=\"*{username}\" \/>\n            <span th:if=\"${#fields.hasErrors('username')}\" th:errors=\"*{username}\" class=\"error\"><\/span>\n        <\/div>\n        <div>\n            <label for=\"email\">E-posta:<\/label>\n            <input type=\"email\" id=\"email\" th:field=\"*{email}\" \/>\n            <span th:if=\"${#fields.hasErrors('email')}\" th:errors=\"*{email}\" class=\"error\"><\/span>\n        <\/div>\n        <div>\n            <label for=\"password\">\u015eifre:<\/label>\n            <input type=\"password\" id=\"password\" th:field=\"*{password}\" \/>\n            <span th:if=\"${#fields.hasErrors('password')}\" th:errors=\"*{password}\" class=\"error\"><\/span>\n        <\/div>\n        <div>\n            <label for=\"age\">Ya\u015f:<\/label>\n            <input type=\"text\" id=\"age\" th:field=\"*{age}\" \/>\n            <span th:if=\"${#fields.hasErrors('age')}\" th:errors=\"*{age}\" class=\"error\"><\/span>\n        <\/div>\n        <div>\n            <button type=\"submit\">Kaydol<\/button>\n        <\/div>\n    <\/form>\n<\/body>\n<\/html>\n<\/code><\/pre>\n<p>Thymeleaf&#8217;in <code>th:field=\"<em>{fieldName}\"<\/code> yap\u0131s\u0131, form alanlar\u0131n\u0131 modeldeki ilgili \u00f6zelliklere ba\u011flar. <code>th:if=\"${#fields.hasErrors('fieldName')}\"<\/code> ve <code>th:errors=\"<\/em>{fieldName}\"<\/code> ise belirli bir alan i\u00e7in validasyon hatas\u0131 varsa, ilgili hata mesaj\u0131n\u0131 g\u00f6stermek i\u00e7in kullan\u0131l\u0131r.<\/p>\n<p><strong><code>success.html<\/code>:<\/strong><\/p>\n<pre><code class=\"language-html\">\n<!DOCTYPE html>\n<html xmlns:th=\"http:\/\/www.thymeleaf.org\">\n<head>\n    <title>Kay\u0131t Ba\u015far\u0131l\u0131<\/title>\n    <style>\n        body { font-family: Arial, sans-serif; margin: 20px; }\n        .success-message { color: green; font-weight: bold; }\n    <\/style>\n<\/head>\n<body>\n    <h2>Kay\u0131t Ba\u015far\u0131l\u0131<\/h2>\n    <p class=\"success-message\" th:text=\"${message}\"><\/p>\n    <a href=\"\/register\">Yeni Kay\u0131t Yap<\/a>\n<\/body>\n<\/html>\n<\/code><\/pre>\n<h3>Hata Mesajlar\u0131n\u0131 \u00d6zelle\u015ftirme ve \u0130leri Seviye Validasyon<\/h3>\n<h4>Hata Mesajlar\u0131n\u0131 \u00d6zelle\u015ftirme (<code>messages.properties<\/code>)<\/h4>\n<p>Model s\u0131n\u0131f\u0131ndaki annotasyonlarda do\u011frudan <code>message=\"...\"<\/code> kullanarak hata mesajlar\u0131n\u0131 belirtebiliriz. Ancak, bu mesajlar\u0131 ayr\u0131 bir kaynak dosyas\u0131nda tutmak (\u00f6rne\u011fin uluslararas\u0131la\u015ft\u0131rma i\u00e7in) daha iyi bir yakla\u015f\u0131md\u0131r. Bunun i\u00e7in <code>src\/main\/resources\/messages.properties<\/code> dosyas\u0131n\u0131 kullanabiliriz:<\/p>\n<pre><code class=\"language-properties\">\n<h2>messages.properties<\/h2>\nNotBlank.user.username=Kullan\u0131c\u0131 ad\u0131 bo\u015f b\u0131rak\u0131lamaz.\nSize.user.username=Kullan\u0131c\u0131 ad\u0131 {min} ile {max} karakter aras\u0131nda olmal\u0131d\u0131r.\nEmail.user.email=Ge\u00e7erli bir e-posta adresi giriniz.\nNotBlank.user.email=E-posta bo\u015f b\u0131rak\u0131lamaz.\nNotBlank.user.password=\u015eifre bo\u015f b\u0131rak\u0131lamaz.\nSize.user.password=\u015eifre en az {min} karakter olmal\u0131d\u0131r.\nMin.user.age=Ya\u015f\u0131n\u0131z en az {value} olmal\u0131d\u0131r.\nMax.user.age=Ya\u015f\u0131n\u0131z {value}'den b\u00fcy\u00fck olamaz.\n<\/code><\/pre>\n<p>Bu dosyay\u0131 kullanabilmek i\u00e7in Spring Boot genellikle otomatik yap\u0131land\u0131r\u0131r. E\u011fer otomatik \u00e7al\u0131\u015fmazsa, <code>application.properties<\/code> dosyan\u0131za <code>spring.messages.basename=messages<\/code> ekleyebilirsiniz. Mesaj anahtarlar\u0131 genellikle <code>{ConstraintName}.{objectName}.{fieldName}<\/code> veya sadece <code>{ConstraintName}<\/code> format\u0131ndad\u0131r.<\/p>\n<h4>Programatik Validasyon (Custom Validator)<\/h4>\n<p>Bazen Bean Validation annotasyonlar\u0131 yeterli olmayabilir, \u00f6zellikle birden fazla alan\u0131 ilgilendiren karma\u015f\u0131k i\u015f kurallar\u0131n\u0131 do\u011frulamak gerekti\u011finde (\u00f6rne\u011fin, &#8220;\u015fifre ve \u015fifre tekrar\u0131 ayn\u0131 olmal\u0131&#8221; gibi). Bu durumlarda Spring&#8217;in <code>org.springframework.validation.Validator<\/code> aray\u00fcz\u00fcn\u00fc uygulayan \u00f6zel bir validat\u00f6r yazabiliriz.<\/p>\n<pre><code class=\"language-java\">\npackage com.example.validationdemo.validator;\n\nimport com.example.validationdemo.model.User;\nimport org.springframework.stereotype.Component;\nimport org.springframework.validation.Errors;\nimport org.springframework.validation.Validator;\n\n@Component\npublic class UserValidator implements Validator {\n\n    @Override\n    public boolean supports(Class<?> clazz) {\n        return User.class.isAssignableFrom(clazz);\n    }\n\n    @Override\n    public void validate(Object target, Errors errors) {\n        User user = (User) target;\n\n        \/\/ \u00d6rnek: Kullan\u0131c\u0131 ad\u0131 ve e-posta ayn\u0131 olamaz kural\u0131\n        if (user.getUsername() != null && user.getEmail() != null &&\n            user.getUsername().equalsIgnoreCase(user.getEmail())) {\n            errors.rejectValue(\"email\", \"email.username.match\", \"E-posta kullan\u0131c\u0131 ad\u0131n\u0131zla ayn\u0131 olamaz.\");\n        }\n\n        \/\/ Ba\u015fka karma\u015f\u0131k i\u015f kurallar\u0131 buraya eklenebilir.\n        \/\/ \u00d6rne\u011fin: \u015eifre tekrar\u0131 kontrol\u00fc i\u00e7in farkl\u0131 bir alan olsayd\u0131.\n        \/\/ if (!user.getPassword().equals(user.getConfirmPassword())) {\n        \/\/     errors.rejectValue(\"confirmPassword\", \"password.mismatch\", \"\u015eifreler e\u015fle\u015fmiyor.\");\n        \/\/ }\n    }\n}\n<\/code><\/pre>\n<p>Bu \u00f6zel validat\u00f6r\u00fc controller&#8217;da kullanmak i\u00e7in <code>@InitBinder<\/code> metodunu kullanabiliriz:<\/p>\n<pre><code class=\"language-java\">\n\/\/ UserController s\u0131n\u0131f\u0131 i\u00e7inde\nimport org.springframework.web.bind.WebDataBinder;\nimport org.springframework.web.bind.annotation.InitBinder;\nimport com.example.validationdemo.validator.UserValidator; \/\/ Yeni eklenen import\n\n\/\/ ...\n\n@Controller\npublic class UserController {\n\n    private final UserValidator userValidator;\n\n    public UserController(UserValidator userValidator) {\n        this.userValidator = userValidator;\n    }\n\n    @InitBinder\n    protected void initBinder(WebDataBinder binder) {\n        binder.addValidators(userValidator);\n    }\n\n    \/\/ ... di\u011fer metodlar (showRegistrationForm, processRegistrationForm)\n    \/\/ processRegistrationForm metodundaki @Valid anotasyonu hem Bean Validation'\u0131 hem de\n    \/\/ addValidators ile eklenen \u00f6zel validat\u00f6r\u00fc tetikleyecektir.\n}\n<\/code><\/pre>\n<p>Art\u0131k <code>@Valid<\/code> annotasyonu hem Bean Validation kurallar\u0131n\u0131 hem de <code>UserValidator<\/code> i\u00e7indeki kurallar\u0131 tetikleyecektir.<\/p>\n<h3>Sonu\u00e7 ve S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<p>Spring MVC, Bean Validation API ile entegrasyonu sayesinde form verilerini do\u011frulamak i\u00e7in g\u00fc\u00e7l\u00fc, esnek ve okunabilir bir mekanizma sunar. Annotasyon tabanl\u0131 validasyon, \u00e7o\u011fu senaryo i\u00e7in yeterli olsa da, \u00f6zel validat\u00f6rler arac\u0131l\u0131\u011f\u0131yla daha karma\u015f\u0131k i\u015f kurallar\u0131n\u0131 da kolayca uygulayabilirsiniz. Do\u011fru validasyon stratejileri uygulamak, uygulaman\u0131z\u0131n sa\u011flaml\u0131\u011f\u0131n\u0131 ve g\u00fcvenli\u011fini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131racakt\u0131r.<\/p>\n<h4>SSS (S\u0131k\u00e7a Sorulan Sorular)<\/h4>\n<h3 id=\"valid-validated-farki\">1. <code>@Valid<\/code> ile <code>@Validated<\/code> aras\u0131ndaki fark nedir?<\/h3>\n<p>Her ikisi de bir nesnenin do\u011frulanmas\u0131 gerekti\u011fini belirtmek i\u00e7in kullan\u0131l\u0131r. Temel fark \u015fudur:<\/p>\n<ul>\n<li><code>@Valid<\/code>: Standart Bean Validation API&#8217;sinin bir par\u00e7as\u0131d\u0131r. T\u00fcm varsay\u0131lan validasyon gruplar\u0131n\u0131 tetikler.<\/li>\n<li><code>@Validated<\/code>: Spring Framework&#8217;e \u00f6zg\u00fcd\u00fcr. <code>@Valid<\/code>&#8216;in t\u00fcm \u00f6zelliklerini sunar ve ek olarak &#8220;validasyon gruplar\u0131n\u0131&#8221; belirtmenize olanak tan\u0131r. Bu sayede, farkl\u0131 senaryolar (\u00f6rne\u011fin, &#8220;kay\u0131t&#8221; veya &#8220;g\u00fcncelleme&#8221;) i\u00e7in farkl\u0131 validasyon kurallar\u0131n\u0131 tetikleyebilirsiniz.<\/li>\n<\/ul>\n<p>\u00c7o\u011fu basit senaryoda <code>@Valid<\/code> yeterliyken, daha karma\u015f\u0131k uygulamalarda <code>@Validated<\/code> ile gruplama yetene\u011fi olduk\u00e7a faydal\u0131d\u0131r.<\/p>\n<h3 id=\"bindingresult-parametresi\">2. Neden <code>BindingResult<\/code> parametresi <code>@Valid<\/code>&#8216;den hemen sonra gelmeli?<\/h3>\n<p>Spring MVC, bir controller metodunda <code>@Valid<\/code> veya <code>@Validated<\/code> ile i\u015faretlenmi\u015f bir model nesnesi g\u00f6rd\u00fc\u011f\u00fcnde, do\u011frulama i\u015flemini yapar. E\u011fer <code>BindingResult<\/code> parametresi hemen sonra gelmezse ve do\u011frulama hatalar\u0131 olu\u015fursa, Spring bir <code>MethodArgumentNotValidException<\/code> veya <code>BindException<\/code> f\u0131rlat\u0131r ve bu da uygulaman\u0131z\u0131n 500 hatas\u0131 vermesine neden olur. <code>BindingResult<\/code> nesnesi, bu hatalar\u0131 yakalamak ve i\u015flemek i\u00e7in bir mekanizma sa\u011flar, b\u00f6ylece uygulaman\u0131z hatay\u0131 f\u0131rlatmak yerine kullan\u0131c\u0131ya dost\u00e7a bir \u015fekilde geri bildirimde bulunabilir.<\/p>\n<h3 id=\"global-hata-mesajlari\">3. Global hata mesajlar\u0131n\u0131 nas\u0131l g\u00f6steririz?<\/h3>\n<p><code>BindingResult<\/code> nesnesi sadece alan bazl\u0131 hatalar\u0131 de\u011fil, ayn\u0131 zamanda global hatalar\u0131 da i\u00e7erebilir (\u00f6rne\u011fin, \u00f6zel validat\u00f6rler taraf\u0131ndan eklenen hatalar). Thymeleaf&#8217;te global hatalar\u0131 g\u00f6stermek i\u00e7in <code>th:if=\"${#fields.hasGlobalErrors()}\"<\/code> ve <code>th:errors=\"*{global}\"<\/code> kullan\u0131labilir:<\/p>\n<pre><code class=\"language-html\">\n<div th:if=\"${#fields.hasGlobalErrors()}\">\n    <p class=\"error\" th:each=\"err : ${#fields.globalErrors()}\" th:text=\"${err}\"><\/p>\n<\/div>\n<\/code><\/pre>\n<h3 id=\"validasyon-gruplari\">4. Validasyon gruplar\u0131 nedir ve ne zaman kullan\u0131l\u0131r?<\/h3>\n<p>Validasyon gruplar\u0131, belirli bir senaryo i\u00e7in ge\u00e7erli olacak validasyon kurallar\u0131n\u0131 gruplaman\u0131z\u0131 sa\u011flar. \u00d6rne\u011fin, bir &#8220;Kullan\u0131c\u0131 Kay\u0131t&#8221; formunda \u015fifrenin zorunlu olmas\u0131 gerekirken, &#8220;Kullan\u0131c\u0131 Profili G\u00fcncelleme&#8221; formunda \u015fifrenin iste\u011fe ba\u011fl\u0131 olmas\u0131 istenebilir. <code>@Validated<\/code> annotasyonu ile birlikte bir veya daha fazla interface s\u0131n\u0131f\u0131n\u0131 grup olarak belirtebilirsiniz. \u00d6rne\u011fin:<\/p>\n<pre><code class=\"language-java\">\n\/\/ Gruplar i\u00e7in interface'ler\npublic interface OnCreate {}\npublic interface OnUpdate {}\n\n\/\/ Model s\u0131n\u0131f\u0131nda annotasyonlar\u0131 gruplara g\u00f6re ay\u0131rma\npublic class User {\n    @NotBlank(groups = OnCreate.class) \/\/ Sadece OnCreate grubunda zorunlu\n    private String password;\n    \/\/ ...\n}\n\n\/\/ Controller'da belirli grubu tetikleme\n@PostMapping(\"\/register\")\npublic String processRegistrationForm(@Validated(OnCreate.class) User user, BindingResult bindingResult) {\n    \/\/ ...\n}\n<\/code><\/pre>\n<p>Bu, ayn\u0131 model s\u0131n\u0131f\u0131n\u0131 farkl\u0131 validasyon gereksinimleriyle farkl\u0131 formlarda veya i\u015flemlerden kullan\u0131rken \u00e7ok kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<h3 id=\"webdatabinder-ne-ise-yarar\">5. WebDataBinder ne i\u015fe yarar?<\/h3>\n<p><code>WebDataBinder<\/code>, Spring MVC&#8217;de gelen HTTP istek parametrelerini (form verileri, query parametreleri vb.) controller metotlar\u0131n\u0131n parametrelerine (model nesneleri, temel veri tipleri) ba\u011flamakla g\u00f6revli bir mekanizmad\u0131r. Ayr\u0131ca, bu ba\u011flama i\u015flemi s\u0131ras\u0131nda veri tipi d\u00f6n\u00fc\u015f\u00fcmlerini (\u00f6rne\u011fin string&#8217;i int&#8217;e \u00e7evirme) ve validasyon i\u015flemlerini de y\u00f6netir. <code>@InitBinder<\/code> metodu arac\u0131l\u0131\u011f\u0131yla <code>WebDataBinder<\/code>&#8216;\u0131 \u00f6zelle\u015ftirerek, \u00f6zel validat\u00f6rler ekleyebilir, \u00f6zel tip d\u00f6n\u00fc\u015ft\u00fcr\u00fcc\u00fcler tan\u0131mlayabilir veya belirli alanlar\u0131 ba\u011flama i\u015fleminden hari\u00e7 tutabilirsiniz. Bu, Spring MVC&#8217;nin veri ba\u011flama ve do\u011frulama s\u00fcrecine esnek bir \u015fekilde m\u00fcdahale etmenizi sa\u011flar.<\/p>\n<\/div>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Spring Validasyon \u00d6rne\u011fi &#8211; Spring MVC Form Validator\nWeb uygulamalar\u0131n\u0131n geli\u015ftirilmesinde, kullan\u0131c\u0131dan al\u0131nan verilerin do\u011frulu\u011funu ve","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":[1490],"tags":[],"class_list":{"0":"post-37258","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-mvc","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 Validasyon \u00d6rne\u011fi - Spring MVC Form Validator - 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-validasyon-ornegi-spring-mvc-form-validator\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Spring Validasyon \u00d6rne\u011fi - Spring MVC Form Validator\" \/>\n<meta property=\"og:description\" content=\"Spring Validasyon \u00d6rne\u011fi - Spring MVC Form Validator Web uygulamalar\u0131n\u0131n geli\u015ftirilmesinde, kullan\u0131c\u0131dan al\u0131nan verilerin do\u011frulu\u011funu ve\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/spring-validasyon-ornegi-spring-mvc-form-validator\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-29T11:41:41+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=\"11 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/spring-validasyon-ornegi-spring-mvc-form-validator\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/spring-validasyon-ornegi-spring-mvc-form-validator\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Spring Validasyon \u00d6rne\u011fi &#8211; Spring MVC Form Validator\",\"datePublished\":\"2025-12-29T11:41:41+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/spring-validasyon-ornegi-spring-mvc-form-validator\/\"},\"wordCount\":1469,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"MVC\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/spring-validasyon-ornegi-spring-mvc-form-validator\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/spring-validasyon-ornegi-spring-mvc-form-validator\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/spring-validasyon-ornegi-spring-mvc-form-validator\/\",\"name\":\"Spring Validasyon \u00d6rne\u011fi - Spring MVC Form Validator - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-12-29T11:41:41+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/spring-validasyon-ornegi-spring-mvc-form-validator\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/spring-validasyon-ornegi-spring-mvc-form-validator\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/spring-validasyon-ornegi-spring-mvc-form-validator\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Spring Validasyon \u00d6rne\u011fi &#8211; Spring MVC Form Validator\"}]},{\"@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 Validasyon \u00d6rne\u011fi - Spring MVC Form Validator - 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-validasyon-ornegi-spring-mvc-form-validator\/","og_locale":"tr_TR","og_type":"article","og_title":"Spring Validasyon \u00d6rne\u011fi - Spring MVC Form Validator","og_description":"Spring Validasyon \u00d6rne\u011fi - Spring MVC Form Validator Web uygulamalar\u0131n\u0131n geli\u015ftirilmesinde, kullan\u0131c\u0131dan al\u0131nan verilerin do\u011frulu\u011funu ve","og_url":"https:\/\/fatihsoysal.com\/blog\/spring-validasyon-ornegi-spring-mvc-form-validator\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-12-29T11:41:41+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"11 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/spring-validasyon-ornegi-spring-mvc-form-validator\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/spring-validasyon-ornegi-spring-mvc-form-validator\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Spring Validasyon \u00d6rne\u011fi &#8211; Spring MVC Form Validator","datePublished":"2025-12-29T11:41:41+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/spring-validasyon-ornegi-spring-mvc-form-validator\/"},"wordCount":1469,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["MVC"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/spring-validasyon-ornegi-spring-mvc-form-validator\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/spring-validasyon-ornegi-spring-mvc-form-validator\/","url":"https:\/\/fatihsoysal.com\/blog\/spring-validasyon-ornegi-spring-mvc-form-validator\/","name":"Spring Validasyon \u00d6rne\u011fi - Spring MVC Form Validator - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-12-29T11:41:41+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/spring-validasyon-ornegi-spring-mvc-form-validator\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/spring-validasyon-ornegi-spring-mvc-form-validator\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/spring-validasyon-ornegi-spring-mvc-form-validator\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Spring Validasyon \u00d6rne\u011fi &#8211; Spring MVC Form Validator"}]},{"@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\/37258","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=37258"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/37258\/revisions"}],"predecessor-version":[{"id":37259,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/37258\/revisions\/37259"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=37258"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=37258"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=37258"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}