In diesem Artikel wird das Schreiben eines AOP basierend auf Spring Boot und JDK8 eingeführt, in dem benutzerdefinierte Anmerkungen kombiniert werden, um eine gemeinsame Überprüfung der Schnittstellenparameter zu erreichen.
Grund
Derzeit besteht die häufig verwendete Methode zur Parameterüberprüfung darin, Annotationen zur Entitätsklasse hinzuzufügen. Bei verschiedenen Methoden sind jedoch auch die angewendeten Verifizierungsregeln unterschiedlich. Zum Beispiel gibt es eine AccountVo -Einheit:
public class AccountVo {privater Zeichenfolge Name; // Private Ganzzahl Alter nennen; // Alter}Angenommen, es gibt ein Geschäft: Wenn ein Benutzer registriert, muss er oder sie seinen Namen ausfüllen, und wenn ein Benutzer sich anmeldet, muss er oder sie nur seinen Namen ausfüllen. Dann ist es offensichtlich unangemessen, den Entitätsklassen Überprüfungsregeln hinzuzufügen.
Daher wollte ich schon immer eine Parameterüberprüfung auf Methodenebene implementieren. Verschiedene Methoden können unterschiedliche Überprüfungsregeln für dieselben Entitätsparameter anwenden, die dieses Tool hervorgebracht haben und lange Zeit in der täglichen Arbeit verwendet wurden.
einführen
Schauen wir uns zuerst an, wie man es benutzt:
@ServicePublic Class Testimpl implementiert ITESTService {@Override @check ({"Name", "Alter"}) public void testvalid (AccountVo vo) {// ...}}Die @check -Annotation der Methode zeigt an, dass die Namen und Alterseigenschaften im Parameter AccountVO nicht leer sein können. Zusätzlich zur nicht leeren Überprüfung unterstützt es auch Größenurteil und Gleichstellungsüberprüfung:
@Check ({"id> = 8", "name! = Aaa", "title <10"})Die Standardfehlermeldung gibt Felder zurück, Fehler verursacht und aufgerufene Methoden wie:
updateUserid darf nicht null beim Aufrufen von testvalidid muss> = 8 beim Aufrufen von testvalidname Must!
Die Informationen zur Rückgabe von benutzerdefinierten Fehler werden ebenfalls unterstützt:
@Check ({"Titel <= 8: Die Anzahl der Titelzeichen überschreitet 8 Zeichen nicht, einschließlich Satzzeichen"}) public void testvalid (testpo po) {// ...}Fügen Sie einfach hinzu: Nach der Überprüfungsregel und schreiben Sie benutzerdefinierte Informationen, wodurch die Standardfehlermeldung ersetzt wird.
PS: Das Kernprinzip besteht darin, den Wert des Feldes in der Parameterentität durch Reflexion zu erhalten und dann nach den Regeln zu überprüfen. Derzeit werden derzeit nur Methoden, die einen Parameter enthalten, unterstützt, und die Parameter können nicht vom Grundtyp sein.
verwenden
So verwenden Sie AOP im Spring-Boot Ich werde hier nicht in Details eingehen und hauptsächlich den Kerncode in AOP einführen.
MAVEN -Abhängigkeiten
Zusätzlich zu den Abhängigkeiten mit den Frühlingsboots sind die erforderlichen Abhängigkeiten von Drittanbietern keine Kernabhängigkeiten, und Sie können nach Ihren persönlichen Gewohnheiten wählen:
<!-- for string verification--><dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.3.2</version></dependency><!-- for log printing--><dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version> 1.7.25 </Version> </abhängig>
Benutzerdefinierte Anmerkungen
Import Java.lang.annotation.Elementtype; Import Java.lang.annotation.Retention; Import Java.lang.Annotation */@Target ({elementtype.type, elementtype.method})@Retention (Laufzeit) public @Interface Check {// Feldüberprüfungsregeln, Format: Feldname + Überprüfungsregeln + Dickdarm + Fehlermeldung, z.Kerncode
Führen Sie die Parameterüberprüfung vor der Ausführung der Methode durch, indem Sie die Schnittstellenmethode mit @check Annotation abfangen. Wenn es eine Fehlermeldung gibt, wird sie direkt zurückgegeben:
@Around (value = "@com.cipher.Checker.Check") // Hier müssen Sie in den Pfad der benutzerdefinierten Annotation öffentliche Objektprüfung (ProceedingJoInpoint Point) ändern {Object obj; // Parameter -Verifizierungsstring -String msg = dangeck (Punkt); if (! Stringutils.isempty (msg)) {// Hier können Sie die zurückgegebene Klasse zurückgeben. } obj = point.Procece (); Rückgabe obj;}Die Kernüberprüfungsmethode in der Dokeck -Methode besteht darin, den in der Annotation angegebenen Feldnamen- und Überprüfungsregeln zu erhalten, den Wert des entsprechenden Feldes in der Parameterentität durch Reflexion zu erhalten und dann eine Überprüfung durchzuführen:
/*** Parameterüberprüfung** @param point processJoInpoint* @return Fehlermeldung*/private String dangeck (ProceedingJoInpoint Point) {// Methode Parameterwert Objekt [] argumente = point.getArgs (); // Methodenmethode abrufen = getMethod (Punkt); String methodinfo = stringutils.isempty (method.getName ())? "": "beim Anruf" + method.getName (); String msg = ""; if (isSheck (Methode, Argumente)) {prüft Annotation = method.getannotation (check.class); String [] fields = Annotation.Value (); Objekt vo = Argumente [0]; if (vo == null) {msg = "param kann nicht null sein"; } else {for (String -Feld: Felder) {// Parsing FieldInfo info = Resolvefield (Feld, methodInfo); // Erhalten Sie den Wert des Feldobjektwerts. // Die Verifizierungsregel boolean isvalid = info.optenum.fun.Apply (Wert, info.operatornum) ausführen; msg = isvalid? MSG: info.innernmsg; }}} return msg;}Sie können sehen, dass die Hauptlogik lautet:
Felder analysieren -> den Wert von Feldern erhalten -> Überprüfungsregeln ausführen
Eine Aufzählungsklasse wird intern aufrechterhalten, und die relevanten Überprüfungsvorgänge sind darin angegeben:
/** * Operation Enum */Enum -Operator {/** * größer als */Greater_Than (">", checkParamaspep :: isGreaterThan),/** * größer als oder gleich */greater_than_equal ("> =", checkParamaspect :: igreaterthanequal), ** ** uswess als */Lessel. / *** Weniger oder gleich* / weniger_Than_equal ("<=", checkParamaspep :: islessthanqual), / *** Nicht gleich* / not_equal ("! privater Stringwert; Private Bifunction <Objekt, String, Boolean> Spaß; Operator (String -Wert, Bifunktion <Objekt, String, Boolean> Fun) {this.Value = value; this.fun = Fun; }} Aus Platzgründen werde ich nicht alle Codes nacheinander erweitern. Interessierte Freunde können alle Quellcodes unter der folgenden Adresse erhalten: Ciphermagic/Java-Learn/Sandbox/Checker
Todo
endlich
Vielen Dank für Ihre Lektüre. Freunde, die es mögen, können es auf Github mögen. Wenn Sie Fragen oder Vorschläge haben, hinterlassen Sie bitte eine Nachricht und freuen Sie sich auf Ihre Antwort.
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.