Java Validation Annotation'ları
Tags: java, springboot
Published: 2020-01-31 05:03:59

Spring-Boot uygulamalarında modellerimizi oluştururken validasyon yapabileceğimiz kullanışlı birkaç kütüphane mevcut bu yazıda bunlardan birinden ve kullanabileceğimiz Annotation'lardan bazılarından söz edeceğim. Java Bean'lerinin doğrulanmasında standart framework olarak kullanılan JSR 380'den faydalanacağız.
Kullanıcıdan alacağımız input'lara validasyon uygulamak oldukça temel bir işlem. Bu inputlara doğrulama yapmak bize büyük kolaylık sağlayacaktır.
### JSR 380
JSR 380 Bean Validasyonu için bize Java API'si sağlar. Bu versiyon Java 8 ve üzerinde kullanabileceğimiz Optional ve LocalDate'i de destekleyen Annotationlara sahiptir. JSR 380 hakkında daha fazla bilgi almak için bu adrese göz atabilirsiniz.
### Dependency
Bu özellikleri kullanmak için dependency'lerinize aşağıdaki dependency'yi eklemeniz yeterli olacaktır.
```xml
<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
    <version>2.0.0.Final</version>
</dependency>
```

### Gelelim Kullanımına

![Validation Annotation'ları](https://burakaykan.me/content/images/2020/01/usermodel.png)

```java
    @NotNull
    @NotEmpty
    private String username;
```
__@NotNull__ : Bu annotation'u alan property'nin _null_ olmamasını sağlar, property null olarak set edilmeye çalışıldığında buna engel olacaktır.

__@NotEmpty__ : Özelliğin _boş(empty)_ veya _null_ olmadığını doğrular; String, Collection, Map veya Array'lere uygulanabilir.

```java
    @NotBlank
    private String name;
```

__@NotBlank__ : Yalnızca _text_ alanlara uygulanabilir ve özelliğin _null_ olmasını ve _whitespace_ olmasını engeller.

```java
    @AssertTrue
    private boolean itsTrue;

    @AssertFalse
    private boolean itsFalse;
```

__@AssertTrue__ : Bu annotation'a sahip olan özelliğin _true_ değere olduğunu doğrular.

__@AssertFalse__ : Bu annotation'a sahip olan özelliğin _false_ değere olduğunu doğrular.

```java
    @Email
    private String email;
```

__@Email__ : Bu annotation'a sahip olan özelliğin _geçerli bir e-posta formatına_ sahip olduğunu doğrular.

```java
    @Min(18)
    @Max(99)
    private int age;
```

__@Min__ - __@Max__ : Bu annotationlar property'nin _minimum değerden küçük_, _maksimum değerden büyük_ olmamasını sağlar.

```java
    @Positive
    private int positive;

    @PositiveOrZero
    private int positiveOrZero;

    @Negative
    private int negative;

    @NegativeOrZero
    private double negativeOrZero;
```

__@Positive__ : _Nümerik_ değerlere uygulanabilir değerin _pozitif_ olmasını zorunlu kılar.

__@PositiveOrZero__ : _Nümerik_ değerlere uygulanabilir değerin _pozitif_ ya da _sıfır_ olmasını zorunlu kılar.

__@Negative__ : _Nümerik_ değerlere uygulanabilir değerin _negatif_ olmasını zorunlu kılar.

__@NegativeOrZero__ : _Nümerik_ değerlere uygulanabilir değerin _negatif  ya da sıfır_ olmasını zorunlu kılar.


```java
    @Past
    private LocalDateTime pastDate;

    @PastOrPresent
    private LocalDateTime pastOrPresentDate;

    @Future
    private LocalDateTime futureDate;

    @FutureOrPresent
    private LocalDateTime futureOrPresentDate;
```

__@Past__ : _Tarih alanlarına_ uygulanabilir değerin _geçmiş bir tarih_ olmasını zorunlu kılar. _Java 8'de gelen Tarih tiplerine_ de uygulanabilir.

__@PastOrPresent__ : _Tarih alanlarına_ uygulanabilir değerin _geçmiş bir tarih ya da şimdi_ olmasını zorunlu kılar. _Java 8'de gelen Tarih tiplerine_ de uygulanabilir.

__@Future__ : _Tarih alanlarına_ uygulanabilir değerin _gelecek bir tarih_ olmasını zorunlu kılar. _Java 8'de gelen Tarih tiplerine_ de uygulanabilir.

__@FutureOrPresent__ : _Tarih alanlarına_ uygulanabilir değerin _gelecek bir tarih ya da şimdi_ olmasını zorunlu kılar. _Java 8'de gelen Tarih tiplerine_ de uygulanabilir.

### Annotation'lar Collection elemanlarına da uygulanabilir

```java
List<@NotBlank String> preferences;
```

### Annotation'lar için mesaj belirleme

```java
    @Email(message = "Email alanı email formatına uymalıdır")
    private String email;
```

Annotation'un içine message set edilerek gösterilecek mesaj belirlenebilir.

![Validation Mesajı] (https://burakaykan.me/content/images/2020/01/Screen-Shot-2020-01-27-at-22.48.24.png)

## Ekler

Örnek olarak yazdığım Spring-Boot uygulamasının kodlarını [GitHub] (https://github.com/burakaykan/java-bean-validation) sayfamda bulabilirsiniz. Bu post orijinalde [blogumda] (https://burakaykan.me/java-validation-annotationlari/) yayınlanmıştır.