1: Bases Hibernate-Validator
1. Introduction:
En utilisant les annotations annotations pour ajouter des contraintes aux attributs d'une classe ou d'une classe, vérifiez la légalité de la valeur d'attribut pendant le temps d'exécution.
2. Fonction:
La vérification des paramètres est très importante dans le développement de l'interface de l'API, car le client peut transmettre moins de paramètres, ou la valeur est illégale, ou même la valeur des paramètres est malveillante, de sorte que la légalité des paramètres transmise par le client doit être vérifiée. Parmi eux, l'annoter les règles de vérification des valeurs des paramètres aux attributs par annotation est une manière relativement élégante.
3. Annotations de contraintes couramment utilisées
4. Obtenez un premier validateur d'hibernate
Adresse de classe publique {@notnull private String line1; Ligne de chaîne privée2; String privé zip; État de chaîne privée; @Length (max = 20) @notnull Private String Pays; @Range (min = -2, max = 50, message = "plancher hors de portée") public int plancher; // Getter && seter}Deux: intégrer la vérification de l'hibernate-validateur
Cet exemple est intégré sur la base de l'intégration Springmvc + FastJson (//www.vevb.com/article/139094.htm). Vous pouvez d'abord consulter cet article (avec le code source de téléchargement) et intégrer le validateur hibernate basé sur cet article.
Étapes d'intégration:
1. Introduisez la dépendance à l'hibernate-validator dans pom.xml
<dependency> <proupId> org.hibernate </rom grouped> <Artifactid> Hibernate-Validator </letefactive> <DERNÉRATEUR> 5.4.1.Final </DERNIERSE> </DENDEFENCE>
2. Configurez le validateur dans [xxx] -servlet.xml: hibernatevalidator
<! - <mvc: annotation-driven> ajouter un attribut validator validator = "validator" -> <mvc: annotation-driven validator = "validator"> <mvc: messages-convertisseurs registre-defaults = "true"> <! - Configure fastjson pour remplacer le support Jackson original -> <Ean> <propriété nom = "supportEdMeTytypes"> <listique> <value> text / html; charset = utf-8 </value> <value> application / json </value> </sist> </ propriété> <propriété name = "features"> <sist> <value> quoteFieldNames </value> <value> writeMapNullValue </value> </sist> </prewet> </Ean> </mvc: Message-Converte id = "validator"> <propriété name = "providerClass" value = "org.hibernate.validator.hibernatevalidator" /> <propriété name = "validationMessagesource" ref = "MessageSource" /> </ank <value> classpath: org / hibernate / validator / validationMessages </value> </ist> </ propriété> <propriété name = "useCodeasDefaultMessage" value = "false" /> <propriété name = "defoundCoding" value = "utf-8" /> <propriété name = "cacheconds" value = "60" /> </feg>
3. Définir le fichier de message de vérification Description Validation.Properties dans l'emplacement SRC / Main / Resources / conf / Paramètres
validation.common.not.null = ce champ ne peut pas être vide validation.common.not.range = longueur illégal validation.common.format.error = erreur de format validation.param.age = âge de moins de 18 ans Rep.Error.unknown = Erreur inconnue
4. Créez une nouvelle classe d'entité pour tester
Utilisateur
package com.mengdee.manage.validator; import javax.validation.constraints.min; import javax.validation.constraints.notnull; importer javax.validation.constraints.null; import javax.validation.constraints.email; import org.hibernate.validator.constraints.email; org.hibernate.validator.constraints.length; import org.hibernate.validator.constraints.notblank; public class userentity {@null (groupe ID long privé; @Notblank (groupes = {groupa.class, groupb.class}) @pattern (regexp = "^ (?! [0-9] + $) (?! [A-za-z] + $) [0-9a-za-z] {6,20} $", messu GroupB.class}) mot de passe de chaîne privé; @Notblank (groupes = {groupa.class, groupB.class}) @pattern (regexp = "^ ((13 [0-9]) | (15 [^ 4, // d]) | (18 [0,3-9])) // d {8} $", message = "Le format de numéro de téléphone mobile est incorrect") Phone privée téléphone; @Notblank (groupes = {groupB.class}) @Length (min = 6, max = 12, message = "Longueur de surnom est de 6 à 12 bits") surnom de chaîne privée; @Min (valeur = 18, message = "{validation.param.age}") private int Âge; @Notblank (groupes = {groupa.class}) @email (message = "{validation.common.format.error}") Email de chaîne privée; @Notblank @Length (min = 3, max = 10, message = "{validation.common.not.range}") Nom d'utilisateur de chaîne privée; public utilisateur () {} public long getID () {return id; } public void setid (long id) {this.id = id; } public String getNickName () {return newame; } public void setNickName (String Nelname) {this.nickName = Nontes; } public int getage () {return âge; } public void Setage (int Age) {this.age = age; } public String getEmail () {return e-mail; } public void setEmail (chaîne e-mail) {this.email = e-mail; } public String getPassword () {return mot de passe; } public void setPassword (String Motword) {this.password = mot de passe; } public String getUserName () {return username; } public void setUsername (String username) {this.userName = username; } public String gephone () {return téléphone; } public void setphone (String Phone) {this.phone = téléphone; }}Usermodel
package com.mengdee.manage.validator; import javax.validation.constraints.min; import javax.validation.constraints.pattern; import org.hibernate.validator.constraints.email; import org.hibernate.validator.constraints.length; org.hibernate.validator.constraints.notblank; classe publique UserModel {@min (valeur = 1, message = "La valeur d'ID doit être supérieure à 0") ID long privé; @Notblank @Length (min = 6, max = 12, message = "la longueur de surnom est de 6 à 12 chiffres") surnom de chaîne privée; @Min (valeur = 18, message = "{validation.param.age}") private int Âge; @Notblank @email (message = "{validation.common.format.error}") Email de chaîne privée; @Notblank @pattern (regexp = "^ (?! [0-9] + $) (?! [A-za-z] + $) [0-9a-za-z] {6,20} $", message = "Composition de 6-21 lettres et nombres, ne peut pas être des nombres purs ou un anglais pur") Mot de passe de chaîne privée; @Notblank @Length (min = 3, max = 10, message = "{validation.common.not.range}") Nom d'utilisateur de chaîne privée; @Notblank @pattern (regexp = "^ ((13 [0-9]) | (15 [^ 4, // d]) | (18 [0,3-9])) // d {8} $", message = "Le format de numéro de téléphone mobile est incorrect") Téléphone privé; public userModel () {} public long getID () {return id; } public void setid (long id) {this.id = id; } public String getNickName () {return newame; } public void setNickName (String Nelname) {this.nickName = Nontes; } public int getage () {return âge; } public void Setage (int Age) {this.age = age; } public String getEmail () {return e-mail; } public void setEmail (chaîne e-mail) {this.email = e-mail; } public String getPassword () {return mot de passe; } public void setPassword (String Motword) {this.password = mot de passe; } public String getUserName () {return username; } public void setUsername (String username) {this.userName = username; } public String gephone () {return téléphone; } public void setphone (String Phone) {this.phone = téléphone; }}UserDetail:
package com.mengdee.manage.validator; import org.hibernate.validator.constraints.notblank; public class userDetail {private long id; Adresse de chaîne privée @notblank; @Notblank Private String Company; public userDetail () {} public long getID () {return id; } public void setid (long id) {this.id = id; } public String getAddress () {return adresse; } public void setAddress (adresse de chaîne) {this.address = adresse; } public String getCompany () {return Company; } public void setCompany (String Company) {this.company = entreprise; }}Teste avec ValidController
package com.mengdee.manage.Controller; import javax.servlet.http.httpservletRequest; import javax.validation.valid; import org.springframework.steotype.Controller; import org.springframework.validation.bindingResult; Import Org.springFramework.ViederRor; Import Org.springFramework.FowderRor; Import Org.springFramework.FowderRor; Import Org.springFramework.Fowderror; Import Org.SpringFramework.Fowderror; Import Org.SpringFramework.Fowderror; Import Org.springwork org.springframework.web.bind.annotation.requestmapping; import org.springframework.web.bind.annotation.requestMethod; import org.springframework.web.bind.annotation.responsebody; Importer com.Mengdee.manage.validator.Usermodel; @ Croître @ requête ")") ValidController étend BaseController {// http: // localhost: 8081 / plateforme-springmvc-webapp / valid / test? Age=18&nickname=MengDee&id=1&[email protected]&password=root123&Username=123&phone=18321758957 @RequestMapping (value = "/ test", méthode = requestMethod.get) public @ResponseBody Object Validation (HttpServleRequest Request, @Valid UserModel User, BindingResult BindingResult) {if (binkingResult.Haserror ()) {Fielderror Fielderror = BindingResult.getFIELDRORROR (); return super.ResponseJsonError (Fielderror); } return "ok"; } // Une méthode pour vérifier plusieurs objets en même temps nécessite de lier plusieurs résultats BindingResult. Un @valid apparaît, ce qui correspond à un liaison de liaison déclaré plus tard. @Requestmapping (value = "/ test2", méthode = requestMethod.get) public @ResponseBody Object Validationmore (httpservletRequest request, @valid userModel User, bindingResult bindingResult, @valid userDetail userDetail, bindingResult bindingResult2) {if (binkingResult.HaserRors ()) {Fielderror BindingResult.getFielDerror (); return super.ResponseJsonError (Fielderror); } if (bindingResult2.Haserrors ()) {Fielderror Fielderror = BindingResult2.GetFielDerror (); return super.ResponseJsonError (Fielderror); } return "ok"; }}Remarques sur l'utilisation:
1. Pour plusieurs champs, l'ordre de vérification du système semble être différent de l'ordre de la déclaration de champ, comme s'il n'était pas nécessaire.
2. Pour chaque vérification, s'il n'y a pas d'attribut de message, le système utilisera la valeur par défaut, comme le @notblank correspondant est équivalent à @notblank (message = "ne peut pas être vide")
3. Pour les types de référence tels que la chaîne, vous devez l'utiliser en conjonction avec @notnull, @Notempty ou @notblank. Si vous n'écrivez pas de contrainte vide, après test, ce champ ne participera pas à la vérification. Si vous utilisez @Pattern, @Length, @email, etc. seul, il ne sera pas vérifié. Vous devez utiliser une contrainte vide pour la limiter.
@Min: utilisé pour les types de données de base, tels que int, long, etc.
@Notnull: la valeur de tout objet ne peut être nulle
@Notempty: l'élément de l'objet de collection n'est pas 0, c'est-à-dire que la collection n'est pas vide, et elle peut également être utilisée pour les chaînes et non nuls
@Notblank: il ne peut être utilisé que pour la chaîne et non nulle, et la longueur dans la chaîne TRIM () sera supérieure à 0
Trois: vérification de groupe @validated
1. Le rôle du regroupement (scénario d'utilisation):
Chaque contrainte d'annotation de vérification a un attribut de groupe, qui est utilisé pour spécifier le groupe auquel la contrainte appartient. De cette façon, plusieurs ensembles de contraintes peuvent être configurés sur le même champ. Lorsque vous l'utilisez, il vous suffit de spécifier quel ensemble de contraintes à utiliser. Par exemple, lors de l'enregistrement des utilisateurs et de la modification des informations de l'utilisateur, l'ID doit être vide lors de l'enregistrement et l'ID ne doit pas être vide lors de la modification des informations de l'utilisateur. Lorsque vous l'utilisez, il vous suffit d'attribuer ces deux contraintes à différents groupes. Par exemple, lors de l'ajout, en utilisant les contraintes du groupe A et en utilisant les contraintes du groupe B lors de la mise à jour.
2. Un paquet est une interface vide
Groupa et GroupB
package com.mengdee.manage.validator; interface publique groupa {} package com.mengdee.manage.validator; public interface groupB {}Lorsque vous utilisez @validated ({groupa.class})
3. Séquence de groupe @groupSequence
Par défaut, la vérification des contraintes de différents groupes n'est pas ordonnée, et la séquence de groupe est vérifiée en séquence dans le groupe avant et après l'ordre, telles que la vérification d'abord des contraintes du groupe GroupA, puis vérifiant les contraintes du groupe GroupB. S'il existe des exigences pour l'ordre de vérification des groupes, par exemple, vous devez d'abord vérifier le groupe A, puis vérifier le groupe B, vous pouvez utiliser @GroupSequences pour définir l'ordre de chaque groupe
Utilisez des scénarios:
(1) La vérification des contraintes dans le deuxième groupe repose sur un état stable à exécuter, et cet état stable est vérifié par le premier groupe.
(2) La vérification d'un certain groupe prend du temps et le taux d'utilisation du CPU et de la mémoire est relativement important. Le meilleur choix est de le mettre en dernier pour la vérification. Par conséquent, lors de la vérification du groupe, une méthode de vérification ordonnée est toujours nécessaire, ce qui propose le concept de séquence de groupe.
Un groupe peut être défini comme une séquence d'autres groupes, et il doit se conformer à l'ordre spécifié dans la séquence lorsqu'il est utilisé pour la vérification. Lorsque vous utilisez la vérification de la séquence de groupe, si la vérification du groupe avant l'échec de la séquence, les groupes suivants ne seront plus validés.
Définir la séquence de groupe à l'aide d'annotation GroupSequence: Groupab
package com.mengdee.manage.validator; import javax.validation.groupSequence; @groupSequence ({groupa.class, groupB.class}) interface publique groupab {Validation Controller
package com.mengdee.manage.controller; import javax.servlet.http.httpservletRequest; import org.springframework.sterreotype.Controller; import org.springframework.validation.bindingResult; import org.springframework.validation.annotation.validate com.mengdee.manage.validator.groupa; import com.mengdee.manage.validator.groupab; import com.mengdee.manage.validator.groupb; import com.mengdee.manage.validator.userentity; @ contrôleur @ requestmapping ("/ validé") Classe publique ValuatidationContronCont spécifié lors de la vérification, de sorte que seules les contraintes contenant la groupa sont vérifiées. S'il n'y a pas d'inclusion, il n'y aura pas de vérification. Par exemple, pour le téléphone, le groupe spécifié par @notblank, et @Pattern ne spécifie pas de groupe, alors une seule contrainte est vérifiée et le format de numéro de téléphone mobile n'est pas vérifié // http: // localhost: 8081 / plateforme-springmvc-webapp / valided / groupe RequestMethod.get) public @ResponseBody objet groupa (httpservletRequest request, @validated ({groupa.class}) utilisateur de l'utilisateur, bindingResult bindingResult) {if (bindingResult.haserrors ()) {lisderror filderror = bindingResult.getFielderror (); Renvoie ce.ResponseJSonError (Fielderror); } return "ok"; } // http: // localhost: 8081 / plateforme-springmvc-webapp / validé / groupB? Phone = 123 & mot de passe = root123 & id = 1 @requestmapping (value = "/ groupB", méthode = requestMethod.get) public @ResponseBody GroupBB (httSservlequest request, @VaLidated (}Class}) Utilisateur, BindingResult BindingResult) {if (binkingResult.haserrors ()) {Fielderror Fielderror = bindingResult.getFielDerror (); Renvoie ce.ResponseJSonError (Fielderror); } return "ok"; } // groupab // http: // localhost: 8081 / plateforme-springmvc-webapp / valided / groupab? Phone=111&password=root123&nickname=123&[email protected] // @validated ({groupa.class, themsb.class}): la relation entre groupe et groupb est ou dans le girb.class}):: la relation entre GroupB et le juge ou dans le ou dans le ou dans OR THEPB. base de données. Tant qu'une condition est remplie, la contrainte sera vérifiée. Utilisez plusieurs groupes en même temps pour noter qu'il n'y a pas d'attribut en séquence entre plusieurs groupes. Il ne s'agit pas de vérifier le groupe un premier, puis de vérifier le groupe B. // Parce que les contraintes de l'ID sont vides et non vides, l'attribut est commenté d'abord @ResponseBodybody Groupab (httSservleTrequest request, @Validated ({groupa.class, groupb.class}) BindingResult BindingResult) {if (binkingResult.haserrors ()) {Fielderror Fielderror = BindingResult.getFielDerror (); Renvoie ce.ResponseJSonError (Fielderror); } return "ok"; } // par défaut // http: // localhost: 8081 / plateforme-springmvc-webapp /fault? [email protected]&age=18 // @validated si les groupes ne sont pas spécifiés, vérifiez qu'il n'y a pas d'attribut de groupe (la même que la fonction @valid à ce moment). S'il y a plusieurs contraintes sur un champ, aucun groupe ne doit être spécifié. Si le groupe spécifié est partiellement contraint et que les contraintes partielles ne spécifient pas la contrainte, alors @RequestMapping (value = "/ default", méthode = requestMethod.get) n'est pas vérifiée lorsque vous utilisez @Validated @ResponseBody Object. Fielderror Fielderror = BindingResult.getFielDerror (); Renvoie ce.ResponseJSonError (Fielderror); } return "ok"; } // localhost: 8081 / plateforme-springmvc-webapp / validé / séquence? Phone = 123 & mot de passe = root123 & e-mail = 123 & nautiquer = 123 // Pour plusieurs contraintes sur une propriété, et plusieurs contraintes ne sont pas toutes dans le même groupe, l'ordre de la vérification est vérifié selon l'ordre défini par le groupe de groupe RequestMethod.get) public @ResponseBody Object Sequence (HttpServLetRequest Request, @Validated ({groupab.class}) utilisateur de l'utilisateur, BindingResult BindingResult) {if (bindingResult.Haserrors ()) {Fielderror Fielderror = bindingResult.getFielderror (); Renvoie ce.ResponseJSonError (Fielderror); } return "ok"; }}Quatre: Annotation de validation Hibernate personnalisée
Lorsque l'annotation fournie par la validation Hibernate ne peut pas répondre aux exigences, vous pouvez personnaliser les contraintes de vérification.
Étapes de contrainte d'annotation personnalisée:
Créer une annotation @phone
package com.mengdee.manage.validator; import java.lang.annotation.target; import javax.validation.constraine; import javax.validation.payload; import static java.lang.annotation.elementType.annotation_type; importation static java.lang.annotation.elementtype.Contruit; java.lang.annotation.elementType.field; import static java.lang.annotation.elementtype.method; import static java.lang.annotation.elementType.Parameter; import static java.lang.annotation.retentionPolicy.runtime; import java.lang.annotation.docitededed; java.lang.annotation.retention; @target ({méthode, champ, annotation_type, constructeur, paramètre}) @ retention (runtime) @ documented @ contraint (validedby = {phoneConstraint.class}) public @Interface Phone {String Message () Default "Mobile Phone Number Format"; String regexp () par défaut "^ ((13 [0-9]) | (15 [^ 4, // d]) | (18 [0,3-9])) // d {8} $"; Classe <?> [] Groupes () default {}; Classe <? étend la charge utile> [] Payload () par défaut {}; @Target ({méthode, champ, annotation_type, constructeur, paramètre}) @retention (runtime) @documented public @interface list {phone [] value (); }}Créer une classe de vérification des contraintes correspondant à l'annotation du numéro de téléphone mobile
package com.mengdee.manage.validator; import javax.validation.constraintValidator; import javax.validation.constraintValidatorContext; public class phoneconstraint implémente la contraintevalidator <téléphone, string> {private string regexp; @Override public void Initialize (PhoneEAnnotation) {this.regexp = phoneAnnotation.regexp (); } @Override public boolean isValid (String Value, CONTRAINTVALIDATORCONT CONTEXT) {if (value == null) {return true; // hv000028: exception inattendue pendant l'appel isvalid} if (value.matches (regexp)) {return true; } return false; }}Utilisez Annotation @Phone sur les attributs
package com.mengdee.manage.validator; import org.hibernate.validator.constraints.notblank; public class userDetail {@notblank @phone private String Phone; public userDetail () {} public String gephone () {return téléphone; } public void setphone (String Phone) {this.phone = téléphone; }}Notes de test
// 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"; }Téléchargez le code complet: http://xiazai.vevb.com/201804/yuanma/platform-springmvc-webapp(vevb.com)
Résumer
Ce qui précède est l'intégralité du contenu de cet article. J'espère que le contenu de cet article a une certaine valeur de référence pour l'étude ou le travail de chacun. Si vous avez des questions, vous pouvez laisser un message pour communiquer. Merci pour votre soutien à wulin.com.
Article de référence: