なぜ:
なぜAOPを使用して検証を実現するのですか?
答え:
Spring MVCには独自の検証メカニズム@Valid + BindingResultがありますが、このデフォルトの実装は、検証を実行するためにコントローラーメソッドでBindingResultを受信する必要があります。
例えば:
if(result.haserrors()){list <objecterror> allerrors = result.getallerrors(); List <String> ErrorLists = new ArrayList <>(); for(objecterror objecterror:allerrors){errorlists.add(objecterror.getDefaultMessage()); }}エラーリストを取得します。これが実装されている場合、検証を必要とする各方法は、カプセル化されていても繰り返し呼び出さなければなりません。
上記のステートメントは、Springの@valid + BindingResultの実装を示すことができないかもしれません。 「栗」をお知らせします。
1。Chestnut(古いバージョン)
1.1インターフェイスレイヤー(IDAL)
EG:単純な投稿リクエスト、@RequestBodyはリクエストデータを受信します、@valid + bindingResultが確認を実行します
@responsebody @postmapping( "body")public responsevo bodypost(@requestbody @valid testvo body、bindingResult result){//エラーを確認するif(result.haserrors()){list <objearror> allerrors = result.getallerors();リスト<文字列>リスト= new ArrayList <>(); for(objecterror objecterror:allerrors){lists.add(objecterror.getDefaultMessage()); } new Responsevo(httpstatus.bad_request.value()、 "parameter empty"、lists)を返します。 } new Responsevo(httpstatus.ok.value()、 "bodypost"、null);}1.2エンティティ(VO)検証コンテンツ
@Valid + BindingResultには多くの検証注釈があり、オンラインで触れるとすぐに見つけることができます!
public class testvo {@getter @setter @min(value = 0、message = "request parameter isstringは0未満ではありません")private integer isint; @getter @setter @notblank(message = "request parameter isstringは空にすることはできません")private string isstring;}1.3結果テスト
2。AOP検証(アップグレードバージョン)
ボディポストのように複数のボディをチェックする必要がある場合、コードを継続的に再現する必要があることがわかります。親クラスの再利用可能な方法に変更されたとしても、呼び出さなければなりません。ですから、私はまだそれについて考えた後、それはエレガントではないと感じています。したがって、セクション検証用のAOPがあります。
2.1インターフェイスレイヤー(IDAL)
はい!あなたはそれを正しく読みます、上記のコードはなくなり、親クラスの共有方法を呼び出す必要はありません。 1つの注釈が完了しました:@paramvalid
@paramvalid@responsebody@postmapping( "body")public responsevo bodypost(@requestbody @valid testvo body、bindingResult result){return new Responsevo( "BodyPost"、null);}2.2カスタムアノテーション
この注釈は、単純な方法注釈でもあります。
@target(elementtype.method)@retention(retentionpolicy.runtime)public @interface paramvalid {}2.3キーポイント!アスペクトの実装
セクションの詳細な説明:
@BeFore:Annotation Method @Annotation(xx)を使用します。この方法は、目的の注釈(@paramvalid)を使用するたびに呼び出されます。
JoinPoint:JoinPointを介してメソッドのパラメーターを取得して、BindingResultによって検証された内容を取得します
検証パッケージの移行:元の検証をアスペクトに移行する:valieRequestParams
応答検証結果:
@Aspect@componentPublic class paramvalidaspect {private static final logger log = loggerfactory.getLogger(paramvalidaspect.class); @before( "@annotation(paramvalid)")public void paramvalid(joinpoint 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(result); if(errormap!= null){servletRequestattributes res =(servletRequestattributes)requestContextholder.getRequestattributes(); httpservletResponse応答= res.getResponse(); Response.setcharacterencoding( "utf-8"); Response.setContentType(mediatype.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(errormap); log.info( "AOPパラメーター不規則な検出" +エラー); output.write(error.getBytes( "utf-8")); } catch(ioexception e){log.error(e.getmessage()); }最後に{try {if(output!= null){output.close(); }} catch(ioexception e){log.error(e.getmessage()); }}}}}}} / ** verification* / private Responsevo validRequestParams(bindingResult result){if(result.haserrors()){list <objecterror> allerrors = result.getallerrors();リスト<文字列>リスト= new ArrayList <>(); for(objecterror objecterror:allerrors){lists.add(objecterror.getDefaultMessage()); } new Responsevo(httpstatus.bad_request.value()、 "parameter empty"、lists)を返します。 } nullを返します。 }}2.4テスト結果
上記の2つの結果を読んだ後、検証のためにスプリングAOPを@valid + bindingResultで使用することの利点を比較できます。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。