1: Grundlagen des Hibernate-Validators
1. Einführung:
Überprüfen Sie die Legalität des Attributwerts während der Laufzeit, indem Sie die Annotierungen für Anmerkungen verwenden, um den Attributen einer Klasse oder Klasse Einschränkungen hinzuzufügen.
2. Funktion:
Die Parameterüberprüfung ist bei der Entwicklung der API -Schnittstelle sehr wichtig, da der Kunde weniger Parameter übergeben kann oder der Wert illegal ist oder sogar der Parameterwert bösartig ist, sodass die vom Client übertragene Legalität der Parameter überprüft werden muss. Unter ihnen ist die Annotation der Überprüfungsregeln von Parameterwerten zu Attributen durch Annotation eine relativ elegante Art und Weise.
3.. Allgemein verwendete Einschränkungen Anmerkungen
4. Holen Sie sich einen erstmaligen Hibernate-Validator
öffentliche Klasse Adresse {@notnull private String -Zeile1; private String -Linie2; private String -Zip; privater Stringstaat; @Length (max = 20) @notnull Private String Country; @Range (min = -2, max = 50, Message = "Boden außerhalb der Reichweite") public int floor; // Getter && Setter}Zwei: Überprüfung des Hibernate-Validators integrieren
Dieses Beispiel basiert auf der SpringMVC+Fastjson -Integration (//www.vevb.com/article/139094.htm). Sie können sich zuerst diesen Artikel ansehen (mit Quellcode zum Download) und Hibernate-Validator basierend auf diesem Artikel integrieren.
Integrationsschritte:
1. Einführung der Abhängigkeit des Hibernate-Validators in pom.xml
<Depopenty> <gruppe> org.hibernate </Groupid> <artifactId> Hibernate-Validator </artifactId> <version> 5.4.1.Final </Version> </abhängig>
2. Konfigurieren Sie den Validator in [xxx] -servlet.xml: HibernateValidator
<!-<MVC: Annotationsbetrieben> Hinzufügen von Validator Attribut Validator = "Validator"-> <MVC: Annotationsgetriebene Validator = "Validator"> <MVC: Message-Converters Register-Defaults = "True"> <!-Fastjson, um den ursprünglichen Jackson-Support zu ersetzen-> <bean> <immobilienname = "SupportedMededMedMedyPes". <Wert> text/html; charSet = utf-8 </value> <wert> application/json </value> </list> </property> <Eigenschaft name = "features"> <list> <Wert> QUOTEFIEFFNAMES </value> <Wirts> WriteMapnullValue </value> </list> </property> </mVCELT: <bean id = "validator"> <Eigenschaft name = "ProviderClass" value = "org.hiberNate.validator.hiberNatevalidator"/> <Eigenschaft name = "validationMessageSource" ref = "messusource"/> </bean> <bean id = "messageSource" -Valution ". <wert> classPath: org/hibernate/validator/validationMessages </value> </list> </property> <Eigenschaft name = "useCodeasDeFaultMessage" value = "false"/> <Eigenschaft name = "DefaultCoding" value = "utf-8"/> <Eigenschaft name = "
3. Definieren Sie die Bestätigungsnachrichtendatei Beschreibung Validierung.Properties am Standort SRC/Main/Ressourcen/Konfus/Einstellungen
validierung.common.not.null = Dieses Feld kann nicht leer werden validieren
4. Erstellen Sie eine neue Entitätsklasse zum Testen
Benutzerin
Paket com.mengdee.Manage.validator; import Javax.validation.constraints.min; Import Javax.Validation.Constraints.notnull; org.hiberNate.validator.constraints.length; import org.hibernate.validator.constraints.notblank; public class userEntity {@null (gruppen = {gruppens Ausweis; @NotBlank(groups={GroupA.class, GroupB.class}) @Pattern(regexp="^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,20}$", message="Composition of 6-21 letters and numbers, cannot be pure numbers or pure English", groups={GroupA.class, GroupB.Class}) privates Zeichenfolgenkennwort; @Notblank (Gruppen = {Groupa.class, GroupB.Class}) @PatternN (regexp = "^((13 [0-9]) | (15 [^4, // d]) | (18 [0,3-9])) // D {8} $", Message = "Das mobile Telefonnummer ist falsch") privates Zeichen Telefon; @Notblank (gruppen = {GroupB.Class}) @Length (min = 6, max = 12, Message = "Spitzname Länge ist 6 bis 12 Bits") privater String -Spitzname; @Min (value = 18, message = "{validation.param.age}") Private int Age; @Notblank (gruppen = {gruppe.class}) @email (message = "{validation.common.format.Error}") private String -E -Mail; @Notblank @length (min = 3, max = 10, message = "{validation.common.not.Range}") privater String -Benutzername; public userEntity () {} public long getId () {return id; } public void setId (Long id) {this.id = id; } public String getNickName () {return spickname; } public void setNickName (String -Spitzname) {this.nickname = spitzname; } public int getage () {return ay; } public void setage (int age) {this.age = älter; } public String getemail () {E -Mail zurückgeben; } public void setemail (String -E -Mail) {this.email = E -Mail; } public String getPassword () {Kennwort zurückgeben; } public void setPassword (String -Passwort) {this.password = password; } public String getUnername () {return userername; } public void setUnername (String -Benutzername) {this.username = userername; } public String getphone () {return telefon; } public void setPhone (String -Telefon) {this.phone = Telefon; }}Usermodel
Paket com.mengdee.Manage.validator; import Javax.validation.constraints.min; Import Javax.Validation.Constraint.Pattern; UsModel {@min (value = 1, Message = "ID -Wert muss größer als 0") private Long ID; @Notblank @length (min = 6, max = 12, Message = "Spitzname Länge ist 6 bis 12 Ziffern") privater String -Spitzname; @Min (value = 18, message = "{validation.param.age}") Private int Age; @Notblank @email (Message = "{validation.common.format.Error}") private Zeichenfolge E -Mail; @Notblank @PatternN (regexp = "^(?! [0-9]+$) (?! [A-za-z]+$) [0-9a-za-z] {6,20} $", Message = "Komposition von 6-21 Briefen und Zahlen, kann nicht reine oder reine Englisch") privates Zeichenkennwort; @Notblank @length (min = 3, max = 10, message = "{validation.common.not.Range}") privater String -Benutzername; @Notblank @PatternN (regexp = "^((13 [0-9]) | (15 [^4, // d]) | (18 [0,3-9]) // d {8} $", Message = "Das Format des Handynummers ist falsch") privates Zeichenfolge Telefon; public UsModel () {} public Long getId () {return id; } public void setId (Long id) {this.id = id; } public String getNickName () {return spickname; } public void setNickName (String -Spitzname) {this.nickname = spitzname; } public int getage () {return ay; } public void setage (int age) {this.age = älter; } public String getemail () {E -Mail zurückgeben; } public void setemail (String -E -Mail) {this.email = E -Mail; } public String getPassword () {Kennwort zurückgeben; } public void setPassword (String -Passwort) {this.password = password; } public String getUnername () {return userername; } public void setUnername (String -Benutzername) {this.username = userername; } public String getphone () {return telefon; } public void setPhone (String -Telefon) {this.phone = Telefon; }}Benutzerdetail:
Paket com.mengdee.Manage.validator; import org.hiNNTE.Validator.Constraints.notblank; öffentliche Klasse UserDetail {private long id; @Notblank private String -Adresse; @Notblank Private String Company; public userDetail () {} public long getId () {return id; } public void setId (Long id) {this.id = id; } public String getAddress () {Rückgabeadresse; } public void setAddress (String -Adresse) {this.address = address; } public String getCompany () {Return Company; } public void setCompany (String Company) {this.comPany = Company; }}Tests mit ValidController
Paket com.mengdee.manage.controller; import Javax.servlet.http.httpserquest; import Javax.validation.valid; org. com.mengdee.manage.validator.usermodel;@controller@requestmapping ("/valid") public class ValidController erweitert BaseController {// http://localhost:8081/platform-springmvc-webapp/Valid/test?age=18&nickname=mengdee&id=1&[email protected]&password=root123&username=123&phone=18321758957 @RequestMapping(value = "/test", method = RequestMethod.GET) public @ResponseBody Object Validierung (httpServletRequest -Anforderung, @valid UserModel -Benutzer, BindingResult BindingResult) {if (BindingResult.hasErrors ()) {Fielderror Fielderror = BindingResult.getFielderror (); return Super.ResponsejsonError (Fielderror); } return "ok"; } // Eine Methode zur gleichzeitigen Überprüfung mehrerer Objekte erfordert eine Bindung mehrerer Ergebnisse BindingResult. Es erscheint ein @valid, was einer später deklarierten BindingResult entspricht. @RequestMapping(value = "/test2", method = RequestMethod.GET) public @ResponseBody Object validationMore(HttpServletRequest request, @Valid UserModel user, BindingResult bindingResult, @Valid UserDetail userDetail, BindingResult bindingResult2){ if (bindingResult.hasErrors()) { FieldError fielderror = bindingResult.getFielderRor (); return Super.ResponsejsonError (Fielderror); } if (bindingResult2.haserrors ()) {fielderror fielderror = bindingResult2.getFielderror (); return Super.ResponsejsonError (Fielderror); } return "ok"; }}Anmerkungen zur Verwendung:
1. Für mehrere Felder scheint sich die Reihenfolge der Systemüberprüfung von der Reihenfolge der Felddeklaration zu unterscheiden, als wäre sie unnötig.
2. Wenn es für jede Überprüfung kein Nachrichtenattribut gibt, verwendet das System die Standardeinstellung, z.
3. Als Referenztypen wie Zeichenfolge müssen Sie es in Verbindung mit @notnull, @notEmpty oder @notblank verwenden. Wenn Sie nach dem Test keine leere Einschränkung schreiben, nimmt dieses Feld nicht an der Überprüfung teil. Wenn Sie @Pattern, @Length, @Email usw. allein verwenden, wird es nicht überprüft. Sie müssen eine leere Einschränkung verwenden, um sie zu begrenzen.
@Min: Wird für grundlegende Datentypen wie int, lang usw. verwendet.
@Notnull: Der Wert eines Objekts kann nicht null sein
@NotEmpty: Das Element des Sammlungsobjekts ist nicht 0, dh die Sammlung ist nicht leer und kann auch für Strings verwendet werden, nicht für Null
@Notblank: Es kann nur für Zeichenfolge verwendet werden, nicht null, und die Länge in der String -Trim () ist größer als 0
Drei: Gruppenüberprüfung @Validated
1. Die Rolle der Gruppierung (Szenario verwenden):
Jede Beschränkung der Verifizierungsanmerkungen hat ein Gruppenattribut, mit dem angeben, zu welcher Gruppe die Einschränkung gehört. Auf diese Weise können mehrere Einschränkungen im selben Feld konfiguriert werden. Bei der Verwendung müssen Sie nur angeben, welche Einschränkungen verwendet werden sollen. Wenn Sie beispielsweise Benutzer registrieren und Benutzerinformationen ändern, muss die ID bei der Registrierung leer sein, und die ID darf bei der Änderung der Benutzerinformationen nicht leer sein. Bei der Verwendung müssen Sie diese beiden Einschränkungen nur verschiedenen Gruppen zuweisen. Zum Beispiel beim Hinzufügen, die Verwendung der Einschränkungen der Gruppe A und die Verwendung der Einschränkungen der Gruppe B bei der Aktualisierung.
2. Ein Paket ist eine leere Oberfläche
Groupa und Groupb
Paket com.mengdee.manage.validator; public interface Groupa {} Paket com.mengdee.manage.validator; public interface GroupB {}Bei Verwendung @Validated ({Groupa.class})
3. Gruppensequenz @groupsequence
Standardmäßig ist die Einschränkungsüberprüfung verschiedener Gruppen nicht ordnungsgemäß, und die Gruppensequenz wird vor und nach der Reihenfolge nacheinander verifiziert, z. Wenn beispielsweise Anforderungen an die Überprüfungsreihenfolge von Gruppen vorliegen, müssen Sie zuerst die Gruppe A verifizieren und anschließend die Gruppe B verifizieren, können Sie @Groupsequence verwenden, um die Reihenfolge jeder Gruppe zu definieren
Szenarien verwenden:
(1) Die Beschränkungsüberprüfung in der zweiten Gruppe stützt sich auf einen stabilen Zustand, und dieser stabile Zustand wird von der ersten Gruppe verifiziert.
(2) Die Überprüfung einer bestimmten Gruppe ist zeitaufwändig und die CPU- und Speicherverbrauchsrate ist relativ groß. Die beste Wahl ist, es zuletzt für die Überprüfung zu setzen. Bei der Durchführung einer Gruppenüberprüfung ist daher noch eine geordnete Verifizierungsmethode erforderlich, die das Konzept der Gruppensequenz vorschlägt.
Eine Gruppe kann als Folge anderer Gruppen definiert werden und muss der in der Sequenz angegebenen Reihenfolge bei Verwendung zur Überprüfung entsprechen. Bei Verwendung der Gruppensequenzüberprüfung werden die nachfolgenden Gruppen nicht mehr validiert.
Definieren Sie die Gruppensequenz unter Verwendung einer Annotationsgruppesequenz: GroupAB
Paket com.mengdee.manage.validator; import Javax.validation.groupsequence; @groupsequence ({Groupa.Class, GroupB.Class}) public interface Groupab {ValidationController
Paket com.mengdee.manage.controller; import Javax.servlet.http.httpServletRequest; Import org.springframework.stereotype.Controller; org. com.mengdee.manage.validator.groupa; import com.mengdee.manage.validator.groupab; import com.mengdee.manage.validator.groupb; während der Überprüfung angegeben, so dass nur die Einschränkungen, die Groupa enthalten, überprüft werden. Wenn es keine Einbeziehung gibt, wird es keine Überprüfung geben. For example, for phone, the group specified by @NotBlank, and @Pattern does not specify a group, then only one constraint is checked empty, and the mobile phone number format is not checked// http://localhost:8081/platform-springmvc-webapp/validated/groupA?password=root123&phone=123 @RequestMapping(value = "/groupA", method = RequestMethod.get) public @ResponseBody Object Groupa (httpServletRequest Request, @validated ({Groupa.Class}) Benutzerentitätsnutzer, BindingResult BindingResult) {if (BindingResult.haSeRors ()) {fielderror fielror fielderror = bindingresult.GeSult.Get.GErsult.GErsult.Get. kehre this.responsejsonError (Fielderror); } return "ok"; } // http://localhost:8081/platform-springmvc-webapp/validated/groupB?phone=123&password=root123&id=1 @RequestMapping(value = "/groupB", method = RequestMethod.GET) public @ResponseBody Object groupB(HttpServletRequest request, @Validated({GroupB.class}) UserEntity Benutzer, BindingResult BindingResult) {if (BindingResult.haserrors ()) {Fielderror Fielderror = BindingResult.getFielderRor (); kehre this.responsejsonError (Fielderror); } return "ok"; } // Groupab // http: // localhost: 8081/plattform-springmvc-webapp/validated/Groupab? Telefon=111&password=root123&nickname=123&[email protected] // @validated ({gruupa.classes). Datenbank. Solange eine Bedingung erfüllt ist, wird die Einschränkung überprüft. Verwenden Sie gleichzeitig mehrere Gruppen, um festzustellen, dass zwischen mehreren Gruppen kein Attribut in der Reihenfolge vorhanden ist. Es soll nicht zuerst die Gruppe A verifizieren und anschließend die Gruppe B. // verifizieren, da die Einschränkungen der ID leer und nicht leer sind. Das Attribut wird zuerst kommentiert. BindingResult BindingResult) {if (BindingResult.haserrors ()) {Fielderror Fielderror = BindingResult.GetFielderRor (); kehre this.responsejsonError (Fielderror); } return "ok"; } // Default // http: // localhost: 8081/plattform-springmvc-webapp/default? [email protected]&age=18 // @validated Wenn Gruppen nicht angegeben sind, vergewissern Sie sich, dass es kein Gruppenattribut gibt (das gleiche wie @Valid-Funktion zu dieser Zeit). Wenn in einem Feld mehrere Einschränkungen vorhanden sind, darf keine Gruppe angegeben werden. Wenn die angegebene Gruppe teilweise eingeschränkt ist und teilweise Einschränkungen die Einschränkung nicht angeben, wird @RequestMapping (value = "/default", method = requestMethod.get) bei Verwendung @Validated @RespondeBody Object DeFaultGroup (httpServletRequestanfrage, @Validated UseStoNture userentity user, BindingResult Bonesult) {validated userentity user, bindingresult) nicht überprüft. (BindingResult.haserrors ()) {Fielderror fielderror = BindingResult.getFielderRor (); kehre this.responsejsonError (Fielderror); } return "ok"; } // localhost: 8081/plattformspringmvc-webapp/validated/sequence? Telefon = 123 & passwart = root123 & mail = 123 & fickname = 123 // für mehrere Einschränkungen für eine Eigenschaft, und mehrere Einschränkungen sind nicht allzu gängig. RequestMethod.get) public @ResponseBody -Objektsequenz (httpServletRequest Request, @validated ({Groupab.Class}) Benutzerentitätsnutzer, BindingResult BindingResult) {if (BindingResult.haSeRors ()) {Fielderror Fielderror = BindingResult.GEresult.Get.GeRrors () oder kehre this.responsejsonError (Fielderror); } return "ok"; }}Vier: Custom Hibernate Validation Annotation
Wenn die durch Hibernate -Validierung bereitgestellte Annotation die Anforderungen nicht erfüllen kann, können Sie die Überprüfungsbeschränkungen anpassen.
Benutzerdefinierte Annotationsbeschränkungen: Schritte:
Erstellen Sie Annotation @phone
Paket com.mengdee.manage.validator; import Java.lang.annotation.target; Import Javax.validation java.lang.annotation.elementtype.field; import static java.lang.annotation.elementtype.method; import static java.lang.Annotation java.lang.annotation.retention; @target ({method, field, Annotation_type, Konstruktor, Parameter})@Retention (Laufzeit)@documented@Constraint (validatedBy by = {phoneConstraint.class}) public @Interface Telefon {String -Message () standardmäßig "Mobile telefonnr." String regexp () default "^((13 [0-9]) | (15 [^4, // d]) | (18 [0,3-9]) // d {8} $"; Klasse <?> [] Gruppen () Standard {}; Klasse <? erweitert Payload> [] payload () Standard {}; @Target ({Methode, Feld, Annotation_Type, Konstruktor, Parameter}) @Retention (Laufzeit) @Documented public @Interfaceliste {Telefon [] value (); }}Erstellen Sie eine Einschränkungsüberprüfungsklasse, die der Anmerkung der Mobiltelefonnummer entspricht
Paket com.mengdee.Manage.validator; import Javax.validation.ConstraintValidator; Import Javax.Validation.ConstraintValidatorContext; öffentliche Klasse Phonecontecontecraint Implements ConstraintValidator <Telefon, String> {private String regexp; @Override public void initialize (Telefon phoneAnnotation) {this.regexp = phoneAnnotation.regexp (); } @Override public boolean isValid (String -Wert, ConstraintValidatorContext -Kontext) {if (value == null) {return true; // HV000028: Unerwartete Ausnahme während des isvalid call} if (value.matches (regexp)) {return true; } return false; }}Verwenden Sie Annotation @phone für Attribute
Paket com.mengdee.Manage.validator; import org.hiNNNate.validator.constraints.notblank; öffentliche Klasse UserDetail {@notblank @phone private String -Telefon; public userDetail () {} public String getphone () {return telefon; } public void setPhone (String -Telefon) {this.phone = Telefon; }}Testnotizen
// http://localhost:8081/platform-springmvc-webapp/Valid/test3?address=123&company=456&phone=123 @RequestMapping(value = "/test3", method = RequestMethod.GET) public @ResponseBody Object validationCustomAnnotation(HttpServletRequest request, @Valid UserDetail userDetail, BindingResult BindingResult) {if (BindingResult.haserrors ()) {Fielderror Fielderror = BindingResult.GetFielderRor (); return Super.ResponsejsonError (Fielderror); } return "ok"; }Laden Sie den vollständigen Code herunter: http://xiazai.vevb.com/201804/yuanma/platform-springmvc-webapp(vevb.com).rar
Zusammenfassen
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels einen gewissen Referenzwert für das Studium oder die Arbeit eines jeden hat. Wenn Sie Fragen haben, können Sie eine Nachricht zur Kommunikation überlassen. Vielen Dank für Ihre Unterstützung bei Wulin.com.
Referenzartikel: