In diesem Artikel wird kurz vorgestellt, wie Validierungsschritte eingeführt werden können, wie die Codemenge durch benutzerdefinierte Validierung reduziert und die Produktivität verbessert wird. Besondere Erwähnung: Gültig für nicht primitive Typattribute, Verarbeitung von GET-Methoden, einheitliche Auflösung von Validierungsfehlermeldungen.
Die tatsächliche Implementierung der Validierung in diesem Artikel wird der Hibernate -Validierung für die Verarbeitung anvertraut
Grundkonfiguration
Pom führt Maven -Abhängigkeiten ein
<!-- validation begin --><dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>1.1.0.Final</version></dependency><dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version> 5.4.0.final </Version> </abhängig> <!-Validierungsende->
Fügen Sie die Validierungskonfiguration hinzu
Fügen Sie die folgende Konfiguration zu Spring-MVC-Servlet.xml hinzu:
<MVC: Annotationsbetrieben Validator = "Validator"> <bean id = "validator"> <Eigenschaft name = "ProviderClass" value = "org.hiberNate.validator.hiberNateValidator"/> <Eigenschaft name = "validationMessagesurce" ref = "messusource" // Messource ".
Benutzerdefinierte Ausnahme
Personalisieren Sie die Validierungsfehlermeldung, und die an den Anrufer zurückgegebenen Informationen sind freundlicher. Die folgende Konfiguration wird der applicationContext.xml hinzugefügt:
<!-Laden Sie die I18N-Nachrichtenressourcendatei-> <bean id = "messusource"> <Eigenschaft name = "BasisNames"> <List> <wert> errormsg </value> <wert> validation_error </value> </list> </property> </bean> <bean id = "validationExaceResolver"/> "/>"/> "/>"/> "/>"/> "/>"/> "/>"/> "/>"/> "/>"/> "/>"/> "/>
Hinzugefügt zum Projekt ClassPath: Validation_Error_zh_cn.Properties Resource -Datei:
#Die Fehler msg für die Eingabevalidierung#Commonfield.can.not.be.null = {field} kann nicht leeres Feld sein. ValidationExceptionResovler -Implementierung:
ValidationExceptionResovler.java
@Slf4JPublic Class ValidationExceptionResovler erweitert AbstractHandRerexceptionResolver {public validationExceptionResovler () {// Setzen Sie diesen.setOrder (0); } /** * Behandeln Sie den Fall, in dem ein Argument mit {@code @valid} wie * ein {@link} oder {@link} Argument annotiert ist. * <P> * Benutzerdefinierte ValidationException -Ausnahme -Handler * Die spezifische Validierungsfehlermeldung abrufen und CommonResponse zusammenstellen und zum Anrufer zurückkehren. * * @Param Anfrage aktuelle HTTP -Anforderung * @param Antwortstrom HTTP -Antwort * @param Handler Der ausgeführte Handler * @return Ein leeres ModellandView, das angibt, dass die Ausnahme behandelt wurde. HttpServletRequest -Anforderung, httpServletResponse -Antwort, Objekthandler) löst IOException {list <objeCterror> fehler = bindingResult.getAllErrors () aus; StringBuffer errmsgbf = new StringBuffer (); für (objecterror error: fehler) {String mass = error.getDefaultMessage (); Ermsgbf.Append (Massage); Ermsgbf.Append ("||"); } String errmsgstring = errmsgbf.toString (); Ermsgstring = Errmsgstring.length ()> 2? Ermsgstring.substring (0, errmsgstring.length () - 2): Ermsgstring; log.Error ("Validierung fehlgeschlagen! {}", errmsgstring); Karte <String, Objekt> map = new Treemap <String, Objekt> (); map.put ("Erfolg", falsch); map.put ("ERRORCODE", "9999"); map.put ("errormsg", errmsgstring); ModelAndview mav = new modelAndView (); Mapingjackson2jsonView view = new mapingjackson2jsonView (); View.SetatTributesMap (MAP); mav.setView (Ansicht); MAV zurückgeben; } @Override Protected modelAndView DoreSolveException (httpServletRequest -Anforderung, httpServletResponse -Antwort, Objekthandler, Ausnahme ex) {BindingResult BindingResult = null; if (ex instanceof methodargumentNotvalidexception) {BindingResult = ((methodargumentNotvalidexception) ex) .getBindingResult (); } else if (ex instanceof bindException) {BindingResult = ((BindException) ex) .getBindingResult (); } else {// Andere Ausnahme, ignorieren} if (BindingResult! } catch (ioException e) {log.Error ("DoreSolveException:", e); }} return null; }} Fügen Sie @valid im Controller hinzu
@RequestMapping ("/buy")@responseBodypublic BaserePonse Buy (@RequestBody @valid buyflowerRequest Anfrage) löst eine Ausnahme aus {// ......} Fügen Sie den Attributen, die eine Validierung in der Anforderungs -Bean erfordern, Validierungsanmerkungen hinzu
@Setzter@Getterpublic Class BuyflowerRequest {@notEmpty (Message = "{name.can.not.be.null}") privater String -Name;} Validierung von Sekundärobjekten
Die obige Schreibmethode kann nur die Grundtypattribute von BuyFlowerRequest überprüfen, aber es gibt keine Möglichkeit, die Attribute der Objektattribute zu validieren. Wenn Sie die Attribute des sekundären Objekts validieren müssen, müssen Sie gleichzeitig @Valid- und spezifische Validierungsanmerkungen zum sekundären Objekt und den sekundären Objektattributen hinzufügen.
Die folgende Schreibmethode:
@Setzter @Getterpublic Class BuyflowerRequest {@notEmpty (field = "bianname") privater String -Name; @Min (field = "preis", value = 1) privat int preis; @Notnull private liste <payType> payypelist;} @setzter @Getterpublic class payType {@valid @min (value = 1) privat int payType; @Valid @min (value = 1) Private int payAmount;} Reduzieren Sie die Anzahl der Codierungen weiter
Um den Codierungs -Workload durch benutzerdefinierte Validierungsanmerkungen zu reduzieren, versuchen Sie, den eingereichten Namen der Validierung an die Ressourcendatei der Fehlermeldung zu übergeben, wodurch das Schreiben verschiedener Nachrichtenvorlagen für jede Domäne vermieden wird.
Hier ist ein Beispiel für den umgeschriebenen @notnull:
1. Definieren Sie die Validierungsannotation, beachten Sie, dass Field () im Vergleich zur nativen Annotation hinzugefügt wird, die zum Übergeben des validierten Namens verwendet wird.
Notnull.java
@Target ({Elementtype.method, elementtype.field, elementtype.annotation_type, elementtype.constructor, elementtype.parameter})@condaint (validatedby = {NotnullValidator.class})@Retention (RetentionPolicy.runtime) @Interface @Interface @Interface Notnull {String Field (RetentionPolicy.runtime.runtime @Interface @Interface "; String message () default "{field.can.not.be.null}"; Klasse <?> [] Gruppen () Standard {}; Klasse <? Erweitert Payload> [] payload () Standard {};} 2. Definieren Sie den Validator, alle Validatoren implementieren die ConstraintValidator -Schnittstelle:
NotnullValidator.java
öffentliche Klasse NotnullValidator implementiert ConstraintValidator <Notnull, Objekt> {@Override public void initialize (Notnull Annotation) {} @Override public boolean isvalid (Object Str, ConstraintValidatorContext ConstaintValidatorContext) {return Str! = null; }} 3. Fügen Sie die Annotation der Validierungsanträge hinzu, achten Sie auf die Angabe des eingereichten Werts. Wenn die Nachricht keine personalisierte Anforderung hat, müssen Sie sie nicht angeben. Die Validierungskomponente füllt die Standardnachricht selbst ein.
BuyflowerRequest.java
@Setzter @Getterpublic Class BuyflowerRequest {@notEmpty (field = "bianname") privater String -Name; @Min (field = "preis", value = 1) privat int preis;} Hinweis: Die @Notnull -Annotation unterstützt bereits eine spezielle Überprüfung der Liste. Für Listentypknoten, wenn list == null || list.size () == 0 gibt False zurück und die Validierung fällt fehl. Derzeit wurden die @Notnull, @notEmpty, @min, @max -Anmerkungen nach dieser Idee angepasst und finden Sie im Warenprojekt.
Unterstützt Anfragen
Die obigen Beispiele sind alle Postanfragen. @RequestBody kann Post -Anfragen beheben, unterstützen jedoch keine Get -Anfragen. Lesen Sie die Dokumentation und den Quellcode von Spring und stellten fest, dass @ModelAttribute GET -Anforderungen in Bohnen auflösen und die Validierung unterstützen kann. Details können Sie den Federquellcode: modelAttributemethodProcessor.Resolveargument () -Methode lesen.
Beispiel der Nutzung:
@RequestMapping (value = "/buy", method = requestMethod.get) @ResponseBodypublic BaserePonsed Detail (@valid @ModelAttribute detailFlowerRequest -Anforderung) löst eine Ausnahme aus {detailFlowerResponse -Antwort = new DetailflowerResponse (); response.setName (request.getName ()); return resultfactory.success (Antwort, Baseresponse.class);} Todo
1. Erweitern Sie die Validierung gemäß den Geschäftsszenarien, wie z. B.: Datumsformat, Betrag usw.
2. Unterstützung der Validierung der Überprüfung mehrerer Feldbeziehungen
Anhang: Implementierung des Key Code für Frühlingsvalidierung implementieren
@RequestBody
Implementierungsklasse: RequestResponseBodyMethodProcessor.java
Public Object Resolveargument (Methodparameter Parameter, modelandViewContainer mavcontainer, nativeWebRequest Webrequest, WebDatabinderFactory Binderfactory) löst eine Ausnahme aus {Object arg = this.readWithmessageConverters (WebRequest, Parameter, Parameter.GetGenericPeTypeType (); String name = Conventions.getVariBablEnameForParameter (Parameter); WebDatabinder binder = bindfactory.createbinder (WebRequest, arg, Name); if (arg! = null) {this.ValidateIfApplyable (Binder, Parameter); if (binder.getBindingResult (). haserrors () && this.isbIndexceptionRequired (Binder, Parameter)) {Neue MethodeArgumentNotvalidexception (Parameter, Binder.getBindingResult ()); }} mavcontainer.addAttribute (bindingResult.model_key_prefix + name, binder.getBindingResult ()); kehren Sie arg;} zurück @Modelattuite
Implementierungsklasse: modelAttributemethodprocessor.java
Public Final Object ResolVearGument (MethodParameter Parameter, modelAndViewContainer Mavcontainer, nativeWebRequest Webrequest, WebDatabinderFactory Binderfactory) löst eine Ausnahme aus {String name = modelfactory.getNameForParameter (Parameter); Objektattribut = mavcontainer.containAntribute (Name)? mavcontainer.getModel (). get (name): this.createattribute (Name, Parameter, Bindfactory, WebRequest); if (! mavcontainer.isbindingDisabled (name)) {modelAttribute ann = (modelAttribute) parameter.getParameterAnnotation (modelAttribute.class); if (ann! }} WebDatabinder binder = bindfactory.createbinder (WebRequest, Attribut, Name); if (binder.gettarget ()! } this.ValidateIfApplyable (Binder, Parameter); if (binder.getBindingResult (). haserrors () && this.isbIndexceptionRequired (Binder, Parameter)) {Neue BindException (binder.getBindingResult ()); }} Map <String, Objekt> BindingResultModel = binder.getBindingResult (). GetModel (); mavcontainer.removeAttributes (BindingResultModel); mavcontainer.addallattributes (BindingResultModel); return binder.convertifNeory (binder.gettarget (), parameter.getParameterType (), Parameter);};};Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.