Pourquoi:
Pourquoi utiliser AOP pour obtenir la vérification?
répondre:
Spring MVC a son propre mécanisme de vérification @Valid + BindingResult, mais cette implémentation par défaut doit recevoir BindingResult dans la méthode du contrôleur pour effectuer une vérification.
Par exemple:
if (result.haserrors ()) {list <objectorror> allerrorror = result.getAllErrors (); List <string> errorLists = new ArrayList <> (); pour (objectorror objectorror: allerrors) {errorlists.add (objecterror.getDefaultMessage ()); }}Obtenez des listes d'erreur. Si cela est implémenté, chaque méthode qui nécessite une vérification doit être appelée à plusieurs reprises, même si elle est encapsulée.
Peut-être que l'instruction ci-dessus ne peut pas indiquer la mise en œuvre de @valid + bindingResult de Spring. Permettez-moi de vous donner un "châtaignier".
1. Chestnut (ancienne version)
1.1 Couche d'interface (IDAL)
Par exemple: demande de poste simple, @Requestbody reçoit des données de demande, @Valid + BindingResult effectue une vérification
@ResponseBody @postMapping ("Body") Public ResponseVo BodyPost (@Requestbody @valid TestVo Body, BindingResult Result) {// Vérifiez l'erreur if (result.haserrors ()) {list <objecterror> allerRorror = result.getAllErrors (); List <string> lists = new ArrayList <> (); pour (objecterror objectorror: allerrors) {lists.add (objecterror.getDefaultMessage ()); } return new ResponseVo (httpstatus.bad_request.value (), "Paramètre vide", lists); } retourner la nouvelle réponse (httpstatus.ok.value (), "bodypost", null);}1.2 Contenu de vérification de l'entité (VO)
@Valid + BindingResult a beaucoup d'annotations de vérification, et vous pouvez le trouver dès que vous le touchez en ligne!
classe publique TestVo {@getter @setter @min (valeur = 0, message = "Paramètre de demande ISSTring ne peut pas être inférieur à 0") entier privé isInt; @Getter @setter @notblank (message = "Paramètre de demande Isstring ne peut pas être vide") String privé Isstring;}1.3 Test des résultats
2. Vérification AOP (version mise à niveau)
On peut voir que si plusieurs corps doivent être vérifiés comme BodyPost, alors un morceau de code doit être reproduit en continu. Même s'il est changé pour une méthode réutilisable de classe parent, elle doit être appelée. Je pense donc que ce n'est pas élégant après y avoir pensé. Il y a donc AOP pour la vérification de la section.
2.1 Couche d'interface (IDAL)
Oui! Vous avez bien lu, le code ci-dessus a disparu et il n'est pas nécessaire d'appeler la méthode partagée de la classe parent. Une seule annotation est terminée: @paramvalid
@ Paramvalid @ réponsebody @ postmapping ("body") public réponseVo bodypost (@Requestbody @valid TestVo Body, BindingResult Result) {return new Responsevo ("bodyPost", null);}2.2 Annotation personnalisée
Cette annotation est également une annotation de méthode simple.
@Target (elementType.Method) @retention (retenderPolicy.runtime) public @Interface Paramvalid {}2.3 points clés! Mise en œuvre de l'aspect
Explication détaillée de la section:
@Before: Utilisez la méthode d'annotation @annotation (xx), cette méthode sera appelée chaque fois que vous utilisez l'annotation souhaitée (@paramvalid).
JOINPOINT: Obtenez les paramètres de la méthode via JoinPoint pour obtenir le contenu vérifié par BindingResult
Migrer Package de vérification: migrez la vérification d'origine vers l'aspect: ValidRequestParams
Résultats de la vérification de la réponse:
@ Aspect @ composantpublic class paramvalidaspect {private static final logger log = loggerfactory.getLogger (paramvalidaspect.class); @Before ("@ annotation (paramvalid)") public void paramvalid (point joinpoint, paramvalid paramvalid) {objet [] paramobj = point.getargs (); if (paramobj.length> 0) {if (paramobj [1] instanceof binkingResult) {bindingResult result = (lisingResult) paramobj [1]; ResponseVo errormap = this.validRequestParams (résultat); if (errormap! = null) {servLetRequestAttributes res = (servLetRequestAttributes) requestContexTholder.getRequestAttributes (); HttpServletResponse Response = res.getResponse (); Response.SetcharAtterencoding ("UTF-8"); réponse.setContentType (mediatype.application_json_utf8_value); réponse.setStatus (httpstatus.bad_request.value ()); OutputStream output = null; try {output = resens.getOutputStream (); errormap.setcode (null); String error = new gson (). Tojson (errormap); log.info ("paramètre AOP irrégulier détecté" + erreur); output.write (error.getBytes ("UTF-8")); } catch (ioException e) {log.Error (e.getMessage ()); } enfin {try {if (output! = null) {output.close (); }} catch (ioException e) {log.Error (e.getMessage ()); }}}}}}}} / ** * Vérification * / Private ResponseVo ValidRequestParams (Result BindingResult) {if (result.haserrors ()) {list <objectorror> allerrorror = result.getAllErrors (); List <string> lists = new ArrayList <> (); pour (objecterror objectorror: allerrors) {lists.add (objecterror.getDefaultMessage ()); } return new ResponseVo (httpstatus.bad_request.value (), "Paramètre vide", lists); } return null; }}2.4 Résultats des tests
Après avoir lu les deux résultats ci-dessus, vous pouvez comparer les avantages de l'utilisation de Spring AOP avec @Valid + BindingResult pour la vérification:
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.