Spring Boot Bean Validation

Doğan Ay
4 min readSep 23, 2023

--

Spring Boot, Java tabanlı web uygulamaları geliştirirken sıkça kullanılan bir framework’tür ve bu framework, bean validation (bean doğrulama) özelliğini destekler. Bean validation, özellikle form verilerinin doğrulanması, kullanıcı girişi denetimi ve veri geçerliliğinin sağlanması gibi senaryolarda çok yararlıdır. İşte Spring Boot içindeki bean validationın temel kavramlarını açıklayacağım.

Validation Annotations (Doğrulama İşaretleri): Java bean sınıflarınızda veri doğrulamasını tanımlamak için kullanılan işaretlerdir. javax.validation.constraints paketi altında bulunurlar ve bir alanın veya yöntemin geçerlilik kurallarını belirtmek için kullanılırlar. Örnekler:

  • @Null — Null olur.
  • @NotNull — Null olamaz.
  • @Pattern — Yazılan RegEx patern doğruluğu
  • @NotEmpty — Null ya da empty olamaz.
  • @NonBlank — Whitespace ya da null olamaz.
  • @Email — Email formatını doğrular
  • @AssertTrue — Değer doğru
  • @AssertFalse — Değer yanlış
  • @Min — Büyük veya eşit
  • @Max — Küçük veya eşit
  • @Negative — Negatif zorunlu.
  • @NegativeOrZero — 0 ya da negatif zorunlu
  • @Positive — Pozitif zorunlu
  • @PositiveOrZero — 0 ya da pozitif.
  • @Size — size’ın verilen aralıkta olmalı.
  • @Past — Geçmiş tarih olmalıdır.
  • @PastOrPresent — Geçmiş tarih ya da şimdiki bir tarih olmalıdır.
  • @Future — Gelecek tarih olmalıdır.
  • @FutureOrPresent — Gelecek tarih ya da şimdiki tarih olmalıdır.
  • @CreditCardNumber — Kredi kartı formatı
  • @Currency — Değer kontrolü
  • @EAN — EAN format
  • @ISBN — ISBN format
  • @Length — Verilen uzunlukta olmalıdır.

Validator: Bean validation işlemlerini gerçekleştiren bileşenlerdir. Spring Boot, Java’nın standart bean validation API’sini kullanır. Bu API, veri doğrulamasını işleyen standart bir altyapı sunar. Spring Boot, LocalValidatorFactoryBean gibi birçok önceden yapılandırılmış validator sağlar.

Binding Errors (Bağlama Hataları): Kullanıcıdan gelen verilerin, bean sınıflarına bağlanırken hata oluşturabileceği durumları ifade eder. Örneğin, kullanıcı bir formda bir sayı girmesi gereken yere metin girerse, bu bir bağlama hatasıdır.

Validation Groups (Doğrulama Grupları): Farklı doğrulama kurallarını farklı senaryolarda kullanmak için doğrulama grupları oluşturabilirsiniz. Bu, belirli bir senaryoda hangi doğrulamaların çalışacağını denetlemenizi sağlar.

Spring Boot Validation Starter: Spring Boot, bean validation özelliğini kullanmak için spring-boot-starter-validation adında bir başlangıç bağımlılığı sunar. Bu bağımlılığı projenize ekleyerek, bean validation özelliklerini kullanabilirsiniz.

Doğrulama Hata Mesajları Özelleştirme: Spring Boot, bean validation hata mesajlarını özelleştirmenizi sağlar. ValidationMessages.properties adında bir özellik dosyası oluşturarak özel hata mesajlarını tanımlayabilirsiniz.

Programatik Doğrulama: Bean validation, annotasyonlarla yapılandırılabilir, ancak aynı zamanda programatik olarak da kullanılabilir. Validator nesnelerini ve doğrulama işlemlerini kod içinde yönlendirebilirsiniz.

Şimdi Spring Boot Bean Validation kullandığımız bir örnek proje geliştireceğiz.

Uygulamamızdaki kurmamız gereken bağımlıklar şunlar olacaktır.

  • Spring Boot Starter Validation
  • Spring Boot Starter Web
  • H2
  • Lombok
  • Spring Data JPA

Bunları https://start.spring.io/ sitesinde dependencies kısmında seçip generate edebilirsiniz.

Şimdi Student modelimizi oluşturalım.

@Data
@Entity
public class Student {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

@NotNull //Alanın null olmamasını belirtir.
@Size(min = 2, message = "Must be not null") //Alanın belirtilen min ve max uzunluk aralığında olmasını belirtir.
private String nameSurname;

@Max(value = 99999) //Bu değere Küçük veya eşit
@Positive //Pozitif zorunlu
private int studentNumber;

@NotBlank(message = "Must be not blank") //Whitespace ya da null olamaz.
private String schoolName;

@Email(message = "Email should be valid") //Email formatında olması gerekir.
private String email;

@Min(value = 18, message = "Cannot be younger than 18 years old.")
private int age;

@Pattern(regexp = "[0-9\\s]{12}")
// Yazılan RegEx patern formatında olmalı phone
private String phone;
}

Şimdi repositorymizi oluşturalım.

public interface   StudentRepository extends JpaRepository<Student,Long> {
}

Servis katmanımızı oluşturalım H2 veritabanımıza kayıt edeceğimiz metotlarımızı yazalım. Bunun için ise StudentRepository kullanacağız.

@Service
public class StudentService {

@Autowired
StudentRepository studentRepository;

public void save(Student student){
studentRepository.save(student);
}
}

Controllerimizi oluşturalım, controllerimizde rest api üzerinden erişim sağlanacak bir endpointimiz olacaktır.

@RestController
public class StudentController {

@Autowired
StudentService studentService;

@PostMapping("/save")
ResponseEntity<String> addStudent(@Valid @RequestBody Student student) {
studentService.save(student);
return ResponseEntity.ok("Student Saved");
}

}

@Valid anotasyonu ekleyerek apimize gelen alanlara belirlediğimiz kriterlerin doğruluğu kontrol edilmektedir. Bu anotasyon ile birlikte iş alanlarımızda belirlediğimiz alanların istediğimiz kritere ve doğruluğa olduğu takdirde metotumuza girer aksi takdirde servsimiz hata verir.

Şimdi postman açıp istek atalım.

Postman üzerinden dönen cevabımız bu şekildedir.

Api’yi kullanan kişiye sadece bu mesaj gitmektedir. Bizim yazmış olduğumuz mesajlar gitmiyor, ancak kodu yazdığımız kısımda ki konsol çıktısına baktığımızda hata mesajları gözükmektedir.

Bu mesajları nasıl göstereceğiz sorusuna cevap olarak bu hataları handle ederek yakalayacağız.

@ControllerAdvice Kullanımı

Spring uygulamalarımızın içerisinde oluşabilecek tüm hataları yakalamamıza olanak sağlayan bir anotasyondur. Bu anotasyon sayesinde uygulamalarımızda oluşan hataları handle ederek response’unu kontrol edebiliriz.

Bean validasyon uygulamamızın içerisinde oluşan hataların kullanıcıya gösterilmesi evresinde @ControllerAdvice‘dan yararlanarak oluşan tüm hataların ResponseEntity olarak response’da cevap olarak verilmesini sağlamaktayız.

@ControllerAdvice
public class ValidationHandler extends ResponseEntityExceptionHandler {

@Override
protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex,
HttpHeaders headers, HttpStatus status, WebRequest request) {

Map<String, String> errors = new HashMap<>();
ex.getBindingResult().getAllErrors().forEach((error) ->{
String fieldName = ((FieldError) error).getField();
String message = error.getDefaultMessage();
errors.put(fieldName, message);
});
return new ResponseEntity<Object>(errors, HttpStatus.BAD_REQUEST);
}
}

Yukarıdaki kod bloğunda ise ResponseEntity’lerinden oluşabilecek tüm hataların yakalanıp hata mesajlarının cevap olarak geri döndürülmesini sağlıyoruz. Bu sayede ise bizim entitymizdeki yazdığımız hata mesajlarımız da kullanıcıya cevap olarak döndürülmesini sağlamış oluyoruz.

Şimdi yukarıda ki isteği tekrar atalım postmande ve cevaba bakalım.

Bean validasyon üzerinde bulunan hata mesajlarımız da Controller Advice kullanarak göstermiş olduk.

Kaynakçalar;

--

--

Doğan Ay
Doğan Ay

Written by Doğan Ay

Merhaba, Bilgisayar mühendisiyim şuan da bilgisayar mühendisliğinde tezli yüksek lisans yapıyorum. React , Angular js ,spring boot alanlarında yazılar yazıyorum

Responses (1)