Validated, Valid, Validator – die Unterschiede verstehen
Verwandte Tags:1. Alibaba Cloud bietet FIPS-validiertes HSM für kryptografische Schlüsselsicherheit
2. Gültigkeit von Domainnamen
Validated, Valid, Validator – die Unterschiede verstehen
1. Fazit vorab
Valid vs. Validated – Gemeinsamkeiten
•Beide können Methoden und Parameter validieren
•@Valid und @Validated: Beide Annotationen führen zur Anwendung der Standard-Bean-Validierung.
Wenn die Validierung fehlschlägt, wird eine BindException ausgelöst und eine 400-Antwort (BAD_REQUEST) zurückgegeben; alternativ können Validierungsfehler lokal im Controller über die Parameter Errors oder BindingResult behandelt werden. Wenn sich zusätzlich eine @RequestBody-Annotation vor dem Parameter befindet, löst der Validierungsfehler eine MethodArgumentNotValidException aus.
JSR 380
JSR 380 ist die Java-API-Spezifikation für die Bean-Validierung und Teil von Jakarta EE und JavaSE. Sie stellt sicher, dass die Eigenschaften eines Beans bestimmte Bedingungen erfüllen, indem Annotationen wie @NotNull, @Min und @Max verwendet werden.
Diese Version erfordert Java 8 oder höher und nutzt neue Funktionen von Java 8, wie Typ-Annotationen und die Unterstützung neuer Typen wie Optional und LocalDate.
Für vollständige Informationen zur Spezifikation lesen Sie weiter unter JSR 380.
javax.validation.Valid _
oIst die Standardannotation der JSR-303-Spezifikation und dient als Markierungsannotation.
oDie Annotation unterstützt ElementType#METHOD, ElementType#FIELD, ElementType#CONSTRUCTOR,
oElementType#PARAMETER, ElementType#TYPE_USE
•org.springframework.validation.annotation.Validated _
oIst eine benutzerdefinierte Annotation von Spring, die die Gruppierungsfunktion erweitert.
oDie Annotation unterstützt ElementType#TYPE, ElementType#METHOD, ElementType#PARAMETER
Unterschiede zwischen @Valid und @Validated
Bean Validation 2.0 (JSR 380) definiert ein Metadatenmodell und eine API für die Entitäts- und Methodenvalidierung; Hibernate Validator ist derzeit die beste Implementierung.
Das Validator-Interface bietet drei Methoden, mit denen sich entweder die gesamte Entität oder nur eine einzelne Eigenschaft validieren lässt:
•Validator#validate() validiert alle Constraints aller Beans
•Validator#validateProperty() validiert eine einzelne Eigenschaft
•Validator#validateValue() prüft, ob eine einzelne Eigenschaft einer bestimmten Klasse erfolgreich validiert werden kann
Unabhängig davon, ob es sich um eine RequestBody-Parametervalidierung oder eine Validierung auf Methodenebene handelt, wird letztendlich Hibernate Validator aufgerufen; Spring Validation übernimmt lediglich eine Kapselungsschicht.
Die Validierung von Benutzereingaben ist in den meisten Anwendungen eine Standardfunktion. Im Java-Ökosystem verwenden wir dafür ausschließlich die Java Standard Bean Validation API. Seit Version 4.0 ist diese auch gut in Spring integriert.
In den folgenden Abschnitten werden diese Konzepte detailliert erläutert.
@Valid- und @Validated-Annotationen
In Spring verwenden wir die @Valid-Annotation nach JSR-303 für die Validierung auf Methodenebene. Außerdem nutzen wir sie, um Member-Eigenschaften für die Validierung zu kennzeichnen. Diese Annotation unterstützt jedoch keine Gruppenvalidierung.
Gruppen helfen dabei, die bei der Validierung angewendeten Constraints einzuschränken. Ein besonderer Anwendungsfall sind UI-Assistenten. Im ersten Schritt kann eine Felduntergruppe vorhanden sein. In nachfolgenden Schritten kann eine weitere Gruppe zum selben Bean gehören. Daher müssen in jedem Schritt Constraints auf diese begrenzten Felder angewendet werden, was @Valid nicht unterstützt.
In diesem Fall muss auf Gruppenebene Springs @Validated verwendet werden, eine Variante von JSR-303s @Valid. Diese wird auf Methodenebene eingesetzt. Für die Kennzeichnung von Member-Eigenschaften verwenden wir weiterhin die @Valid-Annotation.
Sehen wir uns nun anhand eines Beispiels die Verwendung dieser Annotationen an.

Betrachten wir eine einfache Benutzerregistrierung, die mit Spring Boot entwickelt wurde. Zunächst haben wir nur die Eigenschaften Name und Passwort:
Nachdem der Test erfolgreich durchlaufen wurde, erweitern wir die Funktionalität. Der nächste logische Schritt ist die Umstellung auf eine komplexe Benutzerregistrierung. Im ersten Schritt bleiben Name und Passwort unverändert. Im zweiten Schritt erfassen wir zusätzliche Informationen wie Alter und Telefonnummer. Daher aktualisieren wir unser Domänenobjekt mit diesen zusätzlichen Feldern:
Diesmal stellen wir jedoch fest, dass der vorherige Test fehlgeschlagen ist. Das liegt daran, dass die Felder Alter und Telefonnummer nicht übergeben wurden. Um dieses Verhalten zu unterstützen, benötigen wir Gruppenvalidierung und die @Validated-Annotation.
Dazu müssen die Felder gruppiert werden, wobei zwei verschiedene Gruppen erstellt werden. Zuerst müssen zwei Marker-Interfaces angelegt werden – eines für jede Gruppe bzw. jeden Schritt. Weitere Details zur Implementierung finden Sie in unserem Artikel zur Gruppenvalidierung. Hier konzentrieren wir uns auf die Unterschiede bei den Annotationen.
Wir verwenden das BasicInfo-Interface für den ersten Schritt und AdvanceInfo für den zweiten Schritt. Zusätzlich aktualisieren wir die UserAccount-Klasse, um diese Marker-Interfaces wie folgt zu verwenden:
Als Nächstes sehen wir uns an, wie @Valid die Validierung verschachtelter Eigenschaften auslöst.
Die @Valid-Annotation wird zur Validierung verschachtelter Eigenschaften verwendet. Sie löst die Validierung verschachtelter Objekte aus. Erstellen wir beispielsweise in unserem aktuellen Szenario ein UserAddress-Objekt:
5. Kombination von @Valid und @Validated für die Mengenprüfung
Wenn der Request Body direkt ein JSON-Array an das Backend übergibt und Sie die Parametervalidierung für jedes Element im Array durchführen möchten: Wenn wir direkt eine List oder ein Set aus java.util.Collection zum Empfangen der Daten verwenden, greift die Parametervalidierung nicht. Wir können eine benutzerdefinierte Listensammlung zum Empfangen der Parameter verwenden:
•Den List-Typ umhüllen und die @Valid-Annotation deklarieren
package com.devicemag.core.BO;
import javax.validation.Valid ; _
import java.util .*;
Validated, Valid, Validator.Fazit
Validated, Valid, Validator.Zusammenfassend lässt sich sagen: Für jede grundlegende Validierung verwenden wir die JSR-Annotation @Valid beim Methodenaufruf. Für jede Gruppenvalidierung, einschließlich Gruppensequenzen, benötigen wir hingegen Springs @Validated-Annotation in unseren Methodenaufrufen. Die @Valid-Annotation ist außerdem erforderlich, um die Validierung verschachtelter Eigenschaften auszulösen.
Validated basiert weiterhin auf AOP. Bei der Methodenvalidierung wird das dynamische AOP-Abfangverfahren eingesetzt, wobei der JSR303-Validator die Überprüfung durchführt. Bei der Attributvalidierung von Beans erfolgt die Validierung basierend auf dem Lebenszyklus des Beans – vor und nach dessen Initialisierung.
2. Gültigkeit von Domainnamen
Validated, Valid, Validator – die Unterschiede verstehen
1. Fazit vorab
Valid vs. Validated – Gemeinsamkeiten
•Beide können Methoden und Parameter validieren
•@Valid und @Validated: Beide Annotationen führen zur Anwendung der Standard-Bean-Validierung.
Wenn die Validierung fehlschlägt, wird eine BindException ausgelöst und eine 400-Antwort (BAD_REQUEST) zurückgegeben; alternativ können Validierungsfehler lokal im Controller über die Parameter Errors oder BindingResult behandelt werden. Wenn sich zusätzlich eine @RequestBody-Annotation vor dem Parameter befindet, löst der Validierungsfehler eine MethodArgumentNotValidException aus.
JSR 380
JSR 380 ist die Java-API-Spezifikation für die Bean-Validierung und Teil von Jakarta EE und JavaSE. Sie stellt sicher, dass die Eigenschaften eines Beans bestimmte Bedingungen erfüllen, indem Annotationen wie @NotNull, @Min und @Max verwendet werden.
Diese Version erfordert Java 8 oder höher und nutzt neue Funktionen von Java 8, wie Typ-Annotationen und die Unterstützung neuer Typen wie Optional und LocalDate.
Für vollständige Informationen zur Spezifikation lesen Sie weiter unter JSR 380.
Was ist der Unterschied zwischen Valid und Validated?
javax.validation.Valid _
oIst die Standardannotation der JSR-303-Spezifikation und dient als Markierungsannotation.
oDie Annotation unterstützt ElementType#METHOD, ElementType#FIELD, ElementType#CONSTRUCTOR,
oElementType#PARAMETER, ElementType#TYPE_USE
•org.springframework.validation.annotation.Validated _
oIst eine benutzerdefinierte Annotation von Spring, die die Gruppierungsfunktion erweitert.
oDie Annotation unterstützt ElementType#TYPE, ElementType#METHOD, ElementType#PARAMETER
Unterschiede zwischen @Valid und @Validated
Validated, Valid, Validator.Validator
Bean Validation 2.0 (JSR 380) definiert ein Metadatenmodell und eine API für die Entitäts- und Methodenvalidierung; Hibernate Validator ist derzeit die beste Implementierung.
Das Validator-Interface bietet drei Methoden, mit denen sich entweder die gesamte Entität oder nur eine einzelne Eigenschaft validieren lässt:
•Validator#validate() validiert alle Constraints aller Beans
•Validator#validateProperty() validiert eine einzelne Eigenschaft
•Validator#validateValue() prüft, ob eine einzelne Eigenschaft einer bestimmten Klasse erfolgreich validiert werden kann
Unabhängig davon, ob es sich um eine RequestBody-Parametervalidierung oder eine Validierung auf Methodenebene handelt, wird letztendlich Hibernate Validator aufgerufen; Spring Validation übernimmt lediglich eine Kapselungsschicht.
Die Validierung von Benutzereingaben ist in den meisten Anwendungen eine Standardfunktion. Im Java-Ökosystem verwenden wir dafür ausschließlich die Java Standard Bean Validation API. Seit Version 4.0 ist diese auch gut in Spring integriert.
In den folgenden Abschnitten werden diese Konzepte detailliert erläutert.
@Valid- und @Validated-Annotationen
In Spring verwenden wir die @Valid-Annotation nach JSR-303 für die Validierung auf Methodenebene. Außerdem nutzen wir sie, um Member-Eigenschaften für die Validierung zu kennzeichnen. Diese Annotation unterstützt jedoch keine Gruppenvalidierung.
Gruppen helfen dabei, die bei der Validierung angewendeten Constraints einzuschränken. Ein besonderer Anwendungsfall sind UI-Assistenten. Im ersten Schritt kann eine Felduntergruppe vorhanden sein. In nachfolgenden Schritten kann eine weitere Gruppe zum selben Bean gehören. Daher müssen in jedem Schritt Constraints auf diese begrenzten Felder angewendet werden, was @Valid nicht unterstützt.
In diesem Fall muss auf Gruppenebene Springs @Validated verwendet werden, eine Variante von JSR-303s @Valid. Diese wird auf Methodenebene eingesetzt. Für die Kennzeichnung von Member-Eigenschaften verwenden wir weiterhin die @Valid-Annotation.
Sehen wir uns nun anhand eines Beispiels die Verwendung dieser Annotationen an.

3. Beispiele
Betrachten wir eine einfache Benutzerregistrierung, die mit Spring Boot entwickelt wurde. Zunächst haben wir nur die Eigenschaften Name und Passwort:
Nachdem der Test erfolgreich durchlaufen wurde, erweitern wir die Funktionalität. Der nächste logische Schritt ist die Umstellung auf eine komplexe Benutzerregistrierung. Im ersten Schritt bleiben Name und Passwort unverändert. Im zweiten Schritt erfassen wir zusätzliche Informationen wie Alter und Telefonnummer. Daher aktualisieren wir unser Domänenobjekt mit diesen zusätzlichen Feldern:
Diesmal stellen wir jedoch fest, dass der vorherige Test fehlgeschlagen ist. Das liegt daran, dass die Felder Alter und Telefonnummer nicht übergeben wurden. Um dieses Verhalten zu unterstützen, benötigen wir Gruppenvalidierung und die @Validated-Annotation.
Dazu müssen die Felder gruppiert werden, wobei zwei verschiedene Gruppen erstellt werden. Zuerst müssen zwei Marker-Interfaces angelegt werden – eines für jede Gruppe bzw. jeden Schritt. Weitere Details zur Implementierung finden Sie in unserem Artikel zur Gruppenvalidierung. Hier konzentrieren wir uns auf die Unterschiede bei den Annotationen.
Wir verwenden das BasicInfo-Interface für den ersten Schritt und AdvanceInfo für den zweiten Schritt. Zusätzlich aktualisieren wir die UserAccount-Klasse, um diese Marker-Interfaces wie folgt zu verwenden:
Als Nächstes sehen wir uns an, wie @Valid die Validierung verschachtelter Eigenschaften auslöst.
Validated, Valid, Validator.Verwendung der verschachtelten Validierung mit @Valid
Die @Valid-Annotation wird zur Validierung verschachtelter Eigenschaften verwendet. Sie löst die Validierung verschachtelter Objekte aus. Erstellen wir beispielsweise in unserem aktuellen Szenario ein UserAddress-Objekt:
5. Kombination von @Valid und @Validated für die Mengenprüfung
Wenn der Request Body direkt ein JSON-Array an das Backend übergibt und Sie die Parametervalidierung für jedes Element im Array durchführen möchten: Wenn wir direkt eine List oder ein Set aus java.util.Collection zum Empfangen der Daten verwenden, greift die Parametervalidierung nicht. Wir können eine benutzerdefinierte Listensammlung zum Empfangen der Parameter verwenden:
•Den List-Typ umhüllen und die @Valid-Annotation deklarieren
package com.devicemag.core.BO;
import javax.validation.Valid ; _
import java.util .*;
Validated, Valid, Validator.Fazit
Validated, Valid, Validator.Zusammenfassend lässt sich sagen: Für jede grundlegende Validierung verwenden wir die JSR-Annotation @Valid beim Methodenaufruf. Für jede Gruppenvalidierung, einschließlich Gruppensequenzen, benötigen wir hingegen Springs @Validated-Annotation in unseren Methodenaufrufen. Die @Valid-Annotation ist außerdem erforderlich, um die Validierung verschachtelter Eigenschaften auszulösen.
Validated basiert weiterhin auf AOP. Bei der Methodenvalidierung wird das dynamische AOP-Abfangverfahren eingesetzt, wobei der JSR303-Validator die Überprüfung durchführt. Bei der Attributvalidierung von Beans erfolgt die Validierung basierend auf dem Lebenszyklus des Beans – vor und nach dessen Initialisierung.
