Commit 9e1482a8 by Patryk Czarnik

BindingResult

parent 1d50dbbd
package sklep.controller; package sklep.controller;
import java.math.BigDecimal;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
...@@ -10,6 +9,7 @@ import org.springframework.beans.factory.annotation.Autowired; ...@@ -10,6 +9,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import org.springframework.ui.Model; import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
...@@ -63,6 +63,7 @@ public class ProductController { ...@@ -63,6 +63,7 @@ public class ProductController {
@PostMapping({"/products/new", "/products/{id}/edit"}) @PostMapping({"/products/new", "/products/{id}/edit"})
public String saveProduct( public String saveProduct(
@Valid Product product, @Valid Product product,
BindingResult bindingResult,
Model model) { Model model) {
// W tej wersji dane z wypełnionego formularza odbieramy w postaci jednego obiektu Product. // W tej wersji dane z wypełnionego formularza odbieramy w postaci jednego obiektu Product.
// Spring sam wpisze dane do pól o takich samych nazwach. // Spring sam wpisze dane do pól o takich samych nazwach.
...@@ -71,10 +72,15 @@ public class ProductController { ...@@ -71,10 +72,15 @@ public class ProductController {
// Kwestia Bean Validation: // Kwestia Bean Validation:
// W tej wersji przed parametrem Product jest adnotacja @Valid // W tej wersji przed parametrem Product jest adnotacja @Valid
// a nie ma parametru BindingResult. // i dodatkowo do metoda posiada parametr BindingResult.
// Wówczas Spring dokonuje walidacji obiektu przed wywołaniem tej metody // Wówczas Spring dokonuje walidacji obiektu przed wywołaniem tej metody
// i w przypadku błędów walidacji NIE WYWOŁA tej metody, tylko zwróci błąd 400. // i informacje o wyniku walidacji przekazuje w parametrze BindingResult.
try { // Metoda jest wywoływana zawsze, a to programista ma sprawdzić czy walidacja się powiodła.
// W BindingResult znajdują się też informacje o błędach.
// Gdybyśmy mimo błędów spróbowali wywołać save, to wtedy Hibernate zablokuje taki zapis.
if(bindingResult.hasErrors()) {
model.addAttribute("errors", bindingResult.getAllErrors());
} else try {
System.out.println("Produkt przed zapisem: " + product); System.out.println("Produkt przed zapisem: " + product);
productRepository.save(product); productRepository.save(product);
System.out.println("Produkt po zapisie : " + product); System.out.println("Produkt po zapisie : " + product);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment