Validation Required
Validation Required (Validasi Wajib) merujuk pada rules yang memastikan bahwa suatu kolom input atau properti tidak boleh dibiarkan kosong oleh pengguna.
3 Anotasi yang sering digunakan:
1. @NotNull: Anotasi ini hanya mengecek apakah nilai objek tersebut adalah null.
- Gunakan untuk: Tipe data objek seperti
Integer,Double,Date, atau objek custom. - Kelemahan: Jika digunakan pada
String, nilai kosong ("") atau spasi (" ") akan tetap dianggap valid karena secara teknis bukannull.
2. @NotEmpty: Anotasi ini memastikan nilai tidak null dan panjangnya (length/size) lebih dari nol.
- Gunakan untuk:
String,List,Map, atauArray. - Kelemahan: Pada
String, input yang hanya berisi spasi (" ") masih dianggap valid.
3. @NotBlank: (Paling Direkomendasikan untuk Text) Anotasi ini adalah yang paling ketat dan paling sering digunakan untuk Text Field. Memastikan nilai tidak null, panjangnya bukan nol, dan bukan berisi spasi saja.
- Gunakan untuk:
String(seperti nama, alamat, username). - Contoh: Input
" "akan dianggap TIDAK VALID oleh@NotBlank.
Contoh:
@NotBlank(message = "Is Required")
private String firstName;
@NotNull(message = "Is Required")
@Size(min = 1, message = "Min 1 char")
private String lastName;
1️⃣ Membuat Class Object
- Membuat Class Model POJO
Person.java, dan menambahkan anotation validation pada field-nya:
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
public class Person {
@NotBlank(message = "Is Required")
private String firstName;
@NotNull(message = "Is Required")
@Size(min = 1, message = "Min 1 char")
private String lastName;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
- Class model di atas akan di mapping dan properties-nya akan di-binding ke dalam element HTML.
2️⃣ Membuat Controller
- Membuat Controller
PersonController.java:
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import com.timposulabs.model.Person;
import jakarta.validation.Valid;
@Controller
public class PersonController {
@GetMapping("/")
public String showForm(Model model) {
model.addAttribute("person", new Person());
return "person-form";
}
@PostMapping("/process")
public String processForm(
@Valid @ModelAttribute("person") Person person,
BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
return "person-form";
} else {
return "person-confirm";
}
}
}
@Valid: Memberitahu Spring: "Tolong validasi objek person ini berdasarkan aturan yang saya tulis di kelas Person sebelum menjalankan isi method ini."@ModelAttribute("person"): Mengambil data dari form HTML dan memasukkannya (binding) ke objek Java person.BindingResult bindingResult:- Aturan Penting: Parameter ini harus diletakkan tepat setelah objek yang divalidasi (
Person). bindingResult.hasErrors(): Jika data yang diinput user melanggar aturan (misal: nama dikosongkan padahal ada@NotBlank), maka method ini akan bernilaitrue.- Alur Error: Jika ada error, user dikembalikan ke file
person-form.htmlagar bisa melihat pesan kesalahan dan memperbaiki inputnya. - Alur Sukses: Jika data valid, user diarahkan ke
person-confirm.html.
- Aturan Penting: Parameter ini harus diletakkan tepat setelah objek yang divalidasi (
3️⃣ Membuat View
- View form
person-form.html.
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Belajar Spring MVC</title>
<style>
.error {color: red;}
</style>
</head>
<body>
<h3>Person Data</h3>
<form th:action="@{/process}" th:object="${person}" method="post">
First Name (*): <input type="text" th:field="*{firstName}" />
<span th:if="${#fields.hasErrors('firstName')}"
th:errors="*{firstName}"
class="error"></span>
<br />
<br />
Last Name (*): <input type="text" th:field="*{lastName}" />
<span th:if="${#fields.hasErrors('lastName')}"
th:errors="*{lastName}"
class="error"></span>
<br />
<br />
<input type="submit" value="Submit" />
</form>
</body>
</html>
${#fields.hasErrors('firstName')}: Fungsi pembantu (utility) dari Thymeleaf untuk mengecek apakah ada kesalahan validasi pada kolomfirstNamesetelah form dikirim.th:errors="*{firstName}": Jika ada error, atribut ini akan otomatis mengambil pesan kesalahan (misalnya dari pesan kustom di Java seperti "Nama tidak boleh kosong") dan menampilkannya di dalam tag<span>.

- View
person-confirm.html.
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Belajar Spring MVC</title>
</head>
<body>
<h3>Person Confirmation</h3>
The person is: <span th:text="${person.firstName} + ' ' + ${person.lastName}"></span>
</body>
</html>