Warum:
Warum AOP verwenden, um eine Überprüfung zu erreichen?
Antwort:
Spring MVC hat einen eigenen Überprüfungsmechanismus @valid + bindingResult, aber diese Standardimplementierung muss BindingResult in der Controller -Methode empfangen, um eine Überprüfung durchzuführen.
z.B:
if (result.hasErrors ()) {list <objecterror> allerrors = result.getAllErrors (); List <String> ERRORLISTS = New ArrayList <> (); für (objecterror objecterror: Allerrors) {errorlists.add (objecterror.getDefaultMessage ()); }}Erhalten Sie Fehlerlisten. Wenn dies implementiert ist, muss jede Methode, die eine Überprüfung erfordert, wiederholt aufgerufen werden, selbst wenn sie eingekapselt sind.
Möglicherweise kann die obige Erklärung die Implementierung von Spring's @Valid + BindingResult nicht angeben. Lassen Sie mich Ihnen eine "Kastanie" geben.
1. Kastanien (alte Version)
1.1 Schnittstellenschicht (IDAL)
EG: Einfache Postanforderung, @RequestBody empfängt Anforderungsdaten, @valid + BindingResult führt Überprüfung durch
@ResponseBody @PostMapping ("Body") public responsevo bodypost (@RequestBody @valid testvo Body, BindingResult -Ergebnis) {// Fehler prüfen if (result.hasErrors ()) {Liste <objecterror> alerrors = result.getAllErrors (); List <String> lists = new ArrayList <> (); für (objecterror objecterror: Alerrors) {lists.add (objecterror.getDefaultMessage ()); } return New responseVo (httpstatus.bad_request.value (), "Parameter leer", listen); } return New ResponseVo (httpstatus.ok.value (), "bodypost", null);}1.2 Entity (VO) -Verifizierungsinhalt
@Valid + BindingResult hat viele Überprüfungsanmerkungen, und Sie können es finden, sobald Sie es online berühren!
public class testVo {@Getter @Setter @min (value = 0, Message = "Anforderungsparameter issstring kann nicht kleiner als 0" sein) private Integer INT; @Getters @Setter @notblank (Message = "Anforderungsparameter ISTRING kann nicht leer sein") private String issstring;}1.3 Ergebnisse Test
2. AOP -Überprüfung (aktualisierte Version)
Es ist ersichtlich, dass, wenn mehrere Körper wie Bodypost überprüft werden müssen, ein Stück Code kontinuierlich reproduziert werden muss. Auch wenn es in eine wiederverwendbare übergeordnete Methode der übergeordneten Klasse geändert wird, muss sie aufgerufen werden. Ich habe immer noch das Gefühl, dass es nicht elegant ist, nachdem ich darüber nachgedacht habe. Es gibt also AOP für die Überprüfung der Abschnitte.
2.1 Schnittstellenschicht (IDAL)
Ja! Sie lesen das richtig, der obige Code ist verschwunden, und es müssen nicht die gemeinsam genutzte Methode der übergeordneten Klasse aufgerufen werden. Nur eine Annotation ist abgeschlossen: @paramvalid
@Paramvalid@responsebody@postmapping ("body") public responsevo bodypost (@RequestBody @valid testvo Body, BindingResult -Ergebnis) {return New ResponseVo ("Bodypost", null);}2.2 benutzerdefinierte Annotation
Diese Annotation ist auch eine einfache Methodeanmerkmale.
@Target (elementtype.method) @Retention (retentionPolicy.Runtime) public @Interface Paramvalid {}2,3 wichtige Punkte! Aspekt -Implementierung
Detaillierte Erläuterung des Abschnitts:
@Before: Verwenden Sie die Annotationsmethode @Annotation (xx), diese Methode wird aufgerufen, wenn Sie die gewünschte Annotation (@paramvalid) verwenden.
Joinpoint: Holen Sie sich die Parameter der Methode über Joinpoint, um den durch BindingResult überprüften Inhalt zu erhalten
Verifizierungspaket migrieren: Migrieren Sie die ursprüngliche Überprüfung in Aspekt: ValidRequestParams
Reaktionsprüfungsergebnisse:
@Aspekt@componentpublic class paramvalIdaspep {private static final Logger log = loggerFactory.getLogger (paramvalidaspect.class); @Before ("@Annotation (paramvalid)") public void paramvalid (jojouspoint point, paramvalid paramvalid) {Object [] paramobj = point.getArgs (); if (paramobj.length> 0) {if (paramobj [1] instanceof bindingResult) {BindingResult result = (BindingResult) paramobj [1]; Responsevo errormap = this.validRequestParams (Ergebnis); if (errormap! = null) {ServletRequestAttributes res = (ServletRequestAttributes) RequestContexTHolder.getRequestAttributes (); HttpServletResponse response = res.getResponse (); response.setcharactercoding ("utf-8"); response.setContentType (mediateType.application_json_utf8_value); response.setStatus (httpstatus.bad_request.Value ()); OutputStream output = null; try {output = response.getOutputStream (); errormap.setCode (null); String error = new GSON (). TOJSON (ERRORRORMAP); log.info ("AOP -Parameter unregelmäßig erkannt" + Fehler); output.write (error.getBytes ("utf-8")); } catch (ioException e) {log.Error (e.getMessage ()); } endlich {try {if (output! = null) {output.close (); }} catch (ioException e) {log.Error (e.getMessage ()); }}}}}}}} / *** verifizieren* / private responsevo validRequestParams (BindingResult -Ergebnis) {if (result.haserrors ()) {list <objecterror> allerrors = result.getAllErrors (); List <String> lists = new ArrayList <> (); für (objecterror objecterror: Alerrors) {lists.add (objecterror.getDefaultMessage ()); } return New responseVo (httpstatus.bad_request.value (), "Parameter leer", listen); } return null; }}2.4 Testergebnisse
Nach dem Lesen der beiden oben genannten Ergebnisse können Sie die Vorteile der Verwendung von Feder AOP mit @Valid + BindingResult zur Überprüfung vergleichen:
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.