Bean Validation 2.0 Giriş
Merhaba arkadaşlar. Bu makalede Bean Validation 2.0 ile beraber gelen standart anotasyonları ve bu anotasyonlar ile bir sınıf örneğinin validasyonunun nasıl olacağını incelemeye çalışacağız.
Bean Validation 2.0, JSR 380 ( https://jcp.org/en/jsr/detail?id=380 ) kapsamında geliştirilen bir spesifikasyondur. Bu spesifikasyonun referans implementasyonu ise Hibernate Validator’ dur.
Öncelikle Bean Validation ile gelen standart anotasyonlar ve kısa açıklamalarına bir bakalım ve ardından basit bir örnek yapalım.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
@NotEmpty -> ilgili alanın null ve empty olmamasını sağlar.(CharSequence, Collection, Map, Array). @NotNull -> ilgili alanın null olmamasını sağlar. @NotBlank -> ilgili alanın null ve empty olmamasını sağlar. Boş karakter olması boş empty anlamına gelir. (CharSequence) @Null -> ilgili alanın null olmasını sağlar. @Max -> ilgili alanın girilen değerden küçük veya eşit olmasını sağlar(BigDecimal, byte, short, int, long) @Min -> ilgili alanın girilen değerden büyük veya eşit olmasını sağlar(BigDecimal, byte, short, int, long) @DecimalMin -> @Min anotasyonunun yaptığı işi yapar. Farkı, ilgili değerin String karşılığını alır ve ORM(hibernate) ile kullanımında metadata'ya etki etmez. Ayrıca inclusive özelliği ile eşitlik koşulunu kaldırabiliriz. @DecimalMax -> @Max anotasyonunun yaptığı işi yapar. Farkı, ilgili değerin String karşılığını alır ve ORM(hibernate) ile kullanımında metadata'ya etki etmez. Ayrıca inclusive özelliği ile eşitlik koşulunu kaldırabiliriz. @Future -> ilgili alanın gelecekte olmasını sağlar(Date, Time) @Past -> ilgili alanın geçmişte olmasını sağlar(Date, Time) @Size -> İlgili alanın size'ının verilen aralıkta olmasını sağlar. Null değerler valid kabul edilir. (CharSequence, Collection, Map, Array) @Pattern -> Regex kullanarak kısıt oluşturabiliriz. Null değerler valid kabul edilir. |
Şimdi bir örnek üzerinden incelemeye başlayalım. Article isimli bir nesnemiz olsun. Sınıfımızın alanları aşağıdaki gibidir.
1 2 3 4 5 6 7 8 9 10 11 |
private String author; private String subject; private List<String> category; private String title; private LocalDate lastSaveDate; private Boolean publish; private String text; |
Bu nesnemiz için geliştirme dökümanında aşağıdaki gibi kısıtların istendiğini düşünelim.
- author alanı boş olamaz
- subject alanı boş olamaz ve A,B ve C tiplerinden biri olmaldır.
- category listesi boş olamaz ve içerisine eklenecek olan elemanlar da null olamaz
- title alanı boş olamaz ve en fazla 30 karakter olabilir
- lastSaveDate alanı geçmişte olamaz
- publish alanı true olmalı.
- text alanı en az 300 en çok 5000 karakter olmalı
Sırası ile alanlarımızı ilgili anotasyonlar ile etiketleyelim.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
@NotBlank(message = "author alanı boş olamaz!") private String author; @NotNull(message = "Subject alanı boş olamaz") @Pattern(regexp="A|B|C") private String subject; @NotEmpty(message = "category listesi bos olamaz") private List<@NotNull(message = "category elemanları null olamaz") String> category; /* Liste elemanlarının @NotNull kontrolü yaptığımıza dikkat edelim. Burada liste elemanları için birden fazla anotasyon kullanabiliriz. */ @NotBlank(message = "Title alanı boş olamaz") @Size(max = 30, message = "Title en çok 30 karakter olabilir") private String title; @FutureOrPresent(message = "lastSaveDate geçmişte olamaz") private LocalDate lastSaveDate; @AssertTrue(message="Publish alanı true olmalı") private Boolean pusblish; @NotBlank(message = "Text alanı null olamaz") @Size(max = 5000, min = 300, message = "Text en az 300 en çok 5000 karakter olabilir") private String text; |
Artık sınıfımızdan bir örnek oluşturup validasyon işlemini yapabiliriz. Bunun için bir Starter sınıfı yapacağız.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
public class Starter { public static void main(String[] args) { Validator validator = Validation.buildDefaultValidatorFactory().getValidator(); Set<ConstraintViolation<Article>> violations = validator.validate(initializeInstance()); violations.forEach(violation -> { System.out.println(violation.getMessage()); }); } static Article initializeInstance() { Article article = new Article(); article.setAuthor(""); article.setCategory(Arrays.asList("A","B",null)); article.setLastSaveDate(LocalDate.of(2019, 02, 8)); article.setPublish(false); article.setSubject("A"); article.setText(""); article.setTitle(""); return article; } } |
Console basılan sonuç;
1 2 3 4 5 6 7 8 9 10 11 12 |
Console basılan sonuç; Title alanı boş olamaz Publish alanı true olmalı author alanı boş olamaz! Text en az 300 en çok 5000 karakter olabilir lastSaveDate geçmişte olamaz Text alanı null olamaz category elemanları null olamaz |
Validasyon işlemini oldukça basit şekilde yapmış olduk. Ne harici bir validasyon sınıfına, ne metotlarına ne de if else bloğuna ihtiyaç duymadan istenilen kısıtları uygulamamıza ekledik. Umarım faydalı olmuştur. Gayret bizden tevfik Allah’tan.
Kaynak Kod : https://github.com/volkanozdemir/validation-api-basic.git