Spring obsługuje dwie różne metody walidacji: walidację Spring i walidację bean JSR-303. Oba mogą być używane przez zdefiniowanie walidatora Spring, który deleguje do innych delegatorów, w tym walidatora bean. Na razie w porządku.
Ale kiedy opisujemy metody, aby faktycznie zażądać walidacji, to już inna historia. Mogę tak opisywać
@RequestMapping(value = "/object", method = RequestMethod.POST)
public @ResponseBody TestObject create(@Valid @RequestBody TestObject obj, BindingResult result) {
lub w ten sposób
@RequestMapping(value = "/object", method = RequestMethod.POST)
public @ResponseBody TestObject create(@Validated @RequestBody TestObject obj, BindingResult result) {
Tutaj @Valid to javax.validation.Valid , a @Validated to org.springframework.validation.annotation.Validated . Dokumentacja tego ostatniego mówi
Wariant Valid JSR-303, wspierający specyfikację grup walidacyjnych. Zaprojektowany do wygodnego użytkowania ze wsparciem Springa JSR-303, ale nie specyficznym dla JSR-303.
co niewiele pomaga, ponieważ nie mówi dokładnie, jak to się różni. Jeżeli w ogóle. Wydaje mi się, że oba działają całkiem nieźle.
źródło
Odpowiedzi:
Jak cytowałeś z dokumentacji,
@Validated
została dodana do obsługi "grup walidacyjnych", czyli grupy pól w walidowanym beanie. Można to wykorzystać w wieloetapowych formularzach, w których można zweryfikować imię i nazwisko, adres e-mail itp. W pierwszym kroku, a następnie inne pola w kolejnych krokach.Powód, dla którego nie został dodany
@Valid
adnotacji, jest to, że jest on ustandaryzowany przy użyciu procesu społeczności java (JSR-303), co zajmuje trochę czasu, a programiści Spring chcieli umożliwić ludziom korzystanie z tej funkcji wcześniej.Przejdź do tego biletu Jira, aby zobaczyć, jak powstała adnotacja.
źródło
Bardziej prosta odpowiedź. Dla tych, którzy wciąż nie wiedzą, co to na ziemi jest „grupa walidacyjna” .
Użycie dla
@Valid
walidacjiKontroler:
Obiekt formularza:
Wykorzystanie dla
@Validated
Validation GroupŹródło: http://blog.codeleak.pl/2014/08/validation-groups-in-spring-mvc.html
Kontroler:
Obiekt formularza:
źródło
W przykładzie fragmenty kodu pytania
@Valid
i@Validated
nie ma znaczenia. Ale jeśli@RequestBody
jest opatrzony adnotacjąList
obiektem lub jest wartością ciągu z adnotacją@RequestParam
, walidacja nie odniesie skutku.Możemy użyć
@Validated
możliwości walidacji na poziomie metody, aby to zadziałało. Aby to osiągnąć, kluczową kwestią jest umieszczenie@Validated
na zajęciach. Może to być kolejna ważna różnica między@Valid
i@Validated
w ramach wiosennych.Odniesienie
źródło
List
obiekty? Zakładam, że to też nie zadziała w przypadku innych kolekcji jakMap
? Może mógłbyś dać mi bardziej szczegółowe wyjaśnienie w moim pytaniu: stackoverflow.com/questions/60167961/ ...poza tym możesz ubiegać się tylko
@Valid
w domenie / polu o zagnieżdżoną walidację, a nie z rozszerzeniem@validated
.źródło