Guide et configuration des paquets
Importer des packages JSR 303 et des forfaits valides Hibernate
<dependency> <proupId> org.hibernate.validator </rombasid> <letifactive> hibernate-validator </ artifactid> <in version> 6.0.5.Final </De version> </Dependency> <Dedency> <ProupId> Javax.Validation </proupId> <Artifactid> Validation-api </ artifactid> <version> 2.0.0.Final </ Version> </ Dependency>
configuration de Springboot
Ressources / application.yml Fichier de ressources de messagerie Configuration de traitement international
printemps:
Messages:
Nom de base: base, Todo # Resource Files Base.properties et todo.properties, séparés par des virgules
Encodage: UTF-8 # Encodage d'analyse doit être spécifié, sinon le code brouillé chinois
Configurer dans la classe de démarrage de Springboot
@SpringBootApplicationPublic Class Application étend webmvcconfigurerAdapter {@value ("$ {printemps.messages.basename}") String Private String Basename; public static void main (String [] args) {SpringApplication.run (application.class, args); } @Bean @Primary Public MessageSource messagesource () {ResourceBundleMessageSource ResourceBundleMessageSource = new ResourceBundLeMessageSource (); ResourceBundleMessageSource.SetUseCodeasDefaultMessage (false); ResourceBundleMessageSource.SetDefaultEncoding ("UTF-8"); // Répéter la définition ResourceBundleMessageSource.setBasenames (basename.split (",")); return ResourceBundleMessageSource; } @Bean @primary public localValidatorFactoryBean Validator () {localValidatorFactoryBean ValidatorFactoryBean = new localValidatorFactoryBean (); ValidatorFactoryBean.SetProviderClass (hibernatevalidator.class); ValidatorFactoryBean.SetValidationMessageSource (MessageSource ()); retour ValidatorFactoryBean; } @Override public Validator getValidator () {return validator (); } / ** * La vérification des paramètres unique au niveau de la méthode est activée * / @Bean publique méthododvalidationPostProcessor methodvalidationPostProcessor () {return new MethodValidyPostProcessor (); }}Nous traitons des exceptions qui ne peuvent pas transmettre les paramètres de vérification et ne peuvent pas passer le lanceur, qui se fait par la capture d'exception unifiée.
@ ControllerAdvice @ ComponentPublic Class bindValidexceptionHandler {@ResponSestatus (Value = httpstatus.ok) @ExceptionHandler (CONSTRAINTVIOLATIONException.classe) public @Responsebody msg handleconstraineviolationException (CONSTRAINTVIOLATIONException e) {String MessageTetemplate = e.getConstraintViolations (). Iterator (). Next (). GetMessageTemplate (); return msg.error (MessageTemplate); } @ResponSestatus (valeur = httpstatus.ok) @ExceptionHandler (bindException.class) public @ResponseBody msg mirebindexception (bindException e) {bindingResult binkingResult = e.getBindingResult (); String className = bindingResult.getTarget (). GetClass (). GetName (); Fielderror next = bindingResult.getFielDerrors (). Iterator (). Next (); String fieldName = next.getField (); String defaultMessage = next.getDefaultMessage (); if (Pattern.Compile ("illégalArgumentException: No Enum"). Matcher (defaultMessage) .Find ()) {Matcher Matcher = Pattern.Compile ("For Value '(. *?)'"). Matcher (defaultMessage); if (Matcher.Find ()) {defaultMessage = "Le type d'énumération ne peut pas être trouvé [" + Matcher.Group (1) + "]"; }} return msg.error (defaultMessage); } @ResponSestatus (valeur = httpstatus.ok) @ExceptionHandler (valiDerror.class) public @ResponseBody msg handleValiDerror (valiDerror e) {return msg.error (e.getMessage ()); }}Ressources / base.propertie
CreatorId = Creator ID ne peut pas être inférieur à {valeur}.
modifierId = modificateur L'ID ne peut pas être inférieur à {valeur}.
ressources / todo.properties
todo.privateid.min = ID privé ne peut pas être inférieur à {valeur}.
Utilisez des annotations sur le champ Bean, où les interfaces C et S du groupe se réfèrent à l'abréviation du contrôleur et du service, qui incluent l'interface d'insertion, l'interface de mise à jour, etc., qui sont toutes des conventions personnalisées.
/ ** * L'ID privé est la clé étrangère représentant plusieurs tables telles que les tâches de projet / tâches / risques / problèmes / examiner les questions à faire * / @ min (value = 1, message = "{too.privateid.min}", groupes = {c.insert.class, c.update.class, s.insert.class, s.update.class}) * / @ Min (value = 1, message = "{Creatorid}", groupes = {s.insert.class}) privé long créatid; contrôleur de contrôle de contrôle vérification @ validé @ restController @ requestmapping ("todo") classe publique Todocontroller {@Autowired Private Todoservice Todoservice; @GetMapping ("getVo") public msg getvo (@min (value = 1, message = "to Do id ne peut pas être inférieur à 1.") @RequestParam (required = false, defaultValue = "0") long id) {return this.todoService.getvo (id); } @Postmapping ("add") public msg add (@validated ({c.insert.class}) todo todo) {return this.todoservice.add (todo); }}@Validated ({c.insert.class}) déclare activer les groupes de vérification sur l'annotation des haricots, et d'autres groupes de vérification n'effectueront pas de vérification, qui peut être distingué pour une vérification distincte.
Par exemple, s'il n'y a pas d'entité et un seul type de données de base, il peut être vérifié, mais trois conditions doivent être remplies:
Vérifiez par vous-même.
Vérification de la couche de service AOP
Classe d'outils validutil
Besoin d'être scanné et enregistré en un seul cas par Springboot
@ComponentPublic Class Validutil {@Autowired Private Validator Validator; public <T> set <contrainntviolation <t>> valider (t objet, classe <?> ... groupes) {return validator.validate (objet, groupes); } public <T> set <contraintviolation <T>> valideValue (class <t> beanType, String PropertyName, Valeur d'objet, classe <?> ... Groupes) {return validator.validaValue (beanType, PropertyName, valeur, groupes); } / ** * Vérifiez le paramètre et renvoyez la première invite d'erreur * @param t objet vérifié * @param Groupes Vérifiez le groupe * @param <T> Type d'origine avant l'effacement de l'objet * @return première invite d'erreur * / public <T> void validAnDreturnFirSterRORTIPS (t t, class <?> ... groupes) {set <contrainviolation <T>> Valated = ValIdator.Valida (T, groupe); if (validate.size ()> 0) {contraintviolation <t> next = validate.iterator (). next (); Message de chaîne = next.getRootBeAnclass (). GetName () + "-" + next.getProperTypath () + "-" + next.getMessage (); Jetez un nouveau validerror (message); }} / ** * Vérifiez le paramètre et renvoyez la première invite d'erreur * @param TargetClass Le type de classe de l'objet qui est validé * @param fieldname Nom qui doit être validé * @param obj Valeur de la propriété requise * @param Groupe Group Group * @param <T> FieldName, objet obj, classe <?> ... groupes) {set <contraintviolation <t>> valide = validator.validaValue (TargetClass, fieldname, obj, groupes); if (validate.size ()> 0) {String Message = TargetClass.getName () + "-" + FieldName + "-" + validate.iterator (). Next (). GetMessage (); Jetez un nouveau validerror (message); }}}Configuration AOP
Le principe principal est d'utiliser la méthode d'interception AOP pour exécuter des paramètres et d'obtenir des annotations pour les paramètres. Utilisez ensuite la classe d'outils pour vérifier les paramètres. Si la vérification échoue, une erreur personnalisée sera directement lancée et l'erreur personnalisée a été traitée à l'échelle mondiale.
@ Aspect @ composantpublic class validatoraop {@autowired private validututil validutil; / ** * Définir les règles d'interception: intercepter toutes les classes sous le package com.service, il existe des méthodes avec @Service Annotation. * / @Pointcut ("Execution (* com.service .. * (..)) et @annotation (org.springframework.sterreotype.service)") public void ContrôleMethodPointCut () {} / ** * Implémentation spécifique de l'intercepteur * / @around ("ControLerMoDpointCut ()") // Spécifier les règles interceptrices; Vous pouvez également écrire directement "Exécution (* com.xjj .........)" dans cet intercepteur d'objet public (ProcedingJoinpoint PJP) {Methodsignature MethodsIgnature = (MethodsIignature) pjp.getSignature (); Method Method = Methodsignature.getMethod (); Annotation [] [] argannotations = méthode.getParameterannotations (); Objet [] args = pjp.getargs (); pour (int i = 0; i <args.length; i ++) {for (annotation annotation: argannotations [i]) {if (validé.class.isinstance (annotation)) {validé validé = (validé) annotation; Classe <?> [] Groupes = validé.value (); validututil.validAndreturnfirSterRortips (args [i], groupes); }} essayez {return pjp.proceed (args); } Catch (Throwable Throwable) {throwable.printStackTrace (); } return true; }}Vérifiez l'annotation @min @notnull Utilisation Méthode
Impossible d'être écrit sur la classe d'implémentation, seules les annotations peuvent être utilisées dans l'interface
Fondamentalement de la même manière que le contrôleur
@ValidatedPublic Interface todoservice {/ ** * requête unique à tâner * @param id numéro de série * @return single tâne * / msg getvo (@min (value = 1, message = "to-id ne peut pas être inférieur à 1.") id long); / ** * Ajouter des données * @param todo objet * / msg add (@validated ({s.insert.class}) todo todo);}Partagez quelques annotations de vérification personnalisées
Vérification nulle de la chaîne
package javax.validation.constaints; import javax.validation.constraint; import javax.validation.constraintValidator; import javax.validation.constraintValidatorContext; import javax.validation.payload; import java.lang.anbern. Il ne peut pas être utilisé et doit être réécrit. Le package ne peut pas être modifié. * / @ Documented @ CONSTRAINT (validedBy = {notblank.notblankvalidator.class}) @ target ({elementType.field, elementType.annotation_type, elementType.paramètre}) @ retention (rétentionpolicy.runtime) public @interface notblank {class <?> [] Groupes () () par défaut}; String message () par défaut "{notblank}"; Classe <? étend la charge utile> [] Payload () par défaut {}; classe notblankvalidator implémente CONSTRAINTVALIDATOR <notblank, objet> {public notblankvalidator () {} @Override public void initialize (notblank contraintannotation) {} @Override public boolean isvalid (objet Valeur, CONSTRAINTVALIDATORCONDEXT Context) {return Value! = Null &&! }}}Jugement de type, pour déterminer si le type est l'une des valeurs, vous pouvez personnaliser le jugement en fonction du groupe de vérification
Resources / Todo.properStifierdo.todotype.insert = Lorsqu'il est nouvellement ajouté, le type de tâches ne peut être que l'une des tâches non projetées, des tâches de projet ou des problèmes. todo.todotype.update = lors de la modification, le type de tâches ne peut être que l'un des risques et examiner les problèmes de tâche. Bean / ** * Todotype0Non-Project Task1Project Task2Problem3Risk4ReviewTodotyPeValid (valeur = {"0", "1", "2"}, message = "{todo.todotype.insert}", groupes = {c.insert.class, s.insert.class}) @ todotypevalid (value = {"3", " "4"}, message = "{todo.todotype.update}", groupes = {c.update.class, s.update.class}) String privé todotype;Annotations personnalisées
@ Documentée @ contrainte (validedBy = {todotypevalid.todotypevalidfactory.class}) @ target ({elementType.field, elementType.annotation_type, elementType.Parameter}) @ retention (retenderPolicy.runtime) @repeableable (toDotypevalid.List.List.class) public @repeableable (toDotypevalid.List.List.Class) {String Message () par défaut "Veuillez saisir le type correct"; String [] value () Default {}; Classe <?> [] Groupes () default {}; Classe <? étend la charge utile> [] Payload () par défaut {}; classe TodotypeValidFactory implémente CONSTRAINTVALIDATOR <TodotypeValid, String> {private String [] AnnotationValue; @Override public void initialize (todotypevalid todostatusvalid) {this.annotationvalue = todostatusvalid.value (); } @Override public boolean isValid (String Value, CONTRAINTVALIDATORCONTTAL CONTEXT) {if (arrays.aslist (annotationValue) .Contains (valeur)) return true; retourne false; }} @Target ({elementType.field, elementType.annotation_type, elementType.Parameter}) @retention (RetenderPolicy.Runtime) @Documented @Interface List {todotypeValid [] value (); }}@Repeatable (todotypevalid.list.class) est la même fonctionnalité à plusieurs reprises annotation prise en charge par JDK8.
Selon ce qui précède, il peut également être utilisé sur les classes d'énumération.
Lorsque Resources / Todo.ProperSticesodo.Todostatus.Insert = Ajouter à nouveau, le statut ne peut être démarré que. Lorsque todo.todostatus.update = est modifié, le statut ne peut être en cours ou terminé. bean / ** * todo status 0 non démarré 1 en cours 2 terminé * / @ todostatusvalid (enums = {todostatus.not_started}, message = "{too.todostatus.insert}", groupes = {c.insert.class, s.insert.class}) @ todostatusvalid (énum = {todostate. Todostatus.complét}, message = "{todo.todostatus.update}", groupes = {c.update.class, s.update.class}) todostatus privé todostatus;Annotations personnalisées
@ Documentée @ contrainte (validedBy = {todostatusvalid.todostatusvalidfactory.class}) @ target ({elementType.field, elementType.annotation_type, elementType.Parameter}) @ retention (retenderpolicy.runtime) @repeatable (todostatusvalid.list.class) TodostatusValid {String Message () par défaut "Veuillez saisir l'état correct"; Todostatus [] enums () default {}; Classe <?> [] Groupes () default {}; Classe <? étend la charge utile> [] Payload () par défaut {}; La classe TodostatusValidFactory implémente CONSTRAINTVALIDATOR <Todostatusvalid, Todostatus> {private todostatus [] enums; @Override public void initialize (todostatusvalid todostatusvalid) {this.enums = todostatusvalid.enums (); } @Override public boolean isvalid (todostatus value, contraintValidatorContext context) {todostatus [] valeurs = todostatus.values (); if (enums! = null && enums.length! = 0) {valeurs = enums; } if (arrays.aslist (valeurs) .Contains (valeur)) renvoie true; retourne false; }} @Target ({elementType.field, elementType.annotation_type, elementType.Parameter}) @retention (RetenderPolicy.Runtime) @Documented @Interface List {TodostaSvalid [] value (); }}Résumer
Ce qui précède est ce que l'éditeur a présenté à Springboot utilise JSR 303 pour vérifier la couche de contrôle du contrôleur et la vérification de la couche de service AOP. Utilisez des fichiers de ressources de message pour internationaliser les messages. J'espère que ce sera utile à tout le monde. Si vous avez des questions, veuillez me laisser un message et l'éditeur répondra à tout le monde à temps. Merci beaucoup pour votre soutien au site Web Wulin.com!