この記事では、スプリングブートとJDK8に基づいてAOPを作成し、カスタムアノテーションを組み合わせて共通のインターフェイスパラメーター検証を実現します。
理由
現在、一般的に使用されるパラメーター検証方法は、エンティティクラスに注釈を追加することですが、さまざまな方法では、適用される検証ルールも異なります。たとえば、accountvoエンティティがあります。
public class councountvo {private string name; //プライベート整数年齢に名前を付けます。 // 年}ビジネスがあるとします。ユーザーが登録すると、彼または彼女が自分の名前を記入する必要があり、ユーザーがログインするとき、彼または彼女は自分の名前を記入するだけです。その後、エンティティクラスに検証ルールを追加することは明らかに不適切です。
したがって、私は常にメソッドレベルのパラメーター検証を実装したいと考えていました。さまざまな方法では、同じエンティティパラメーターに異なる検証ルールを適用できます。これにより、このツールが生まれ、毎日の作業で長い間使用されています。
導入
最初にそれを使用する方法を見てみましょう:
@servicepublic class testimpl ItestService {@override @check({"name"、 "age"})public void testvalid(accountvo vo){// ...}}}メソッドの@Checkアノテーションは、パラメーターAccountVOの名前と年齢のプロパティが空になり得ないことを示しています。空でない検証に加えて、サイズの判断と平等検証もサポートしています。
@check({"id> = 8"、 "name!= aaa"、 "title <10"})デフォルトのエラーメッセージは、フィールド、エラーの原因、および次のようなメソッドと呼ばれるメソッドを返します。
updateUseridはtestvalididを呼び出すときにnull null> = 8 testvalidnameを呼び出します。
カスタムエラー返信情報もサポートされています。
@check({"title <= 8:タイトル文字の数は、句読点を含む8文字を超えません"})public void testvalid(testpo po){// ...}追加:検証ルールの後に、デフォルトのエラーメッセージを置き換えるカスタム情報を記述します。
PS:コア原則は、反射を通じてパラメーターエンティティ内のフィールドの値を取得し、ルールに従って検証することです。したがって、現在、1つのパラメーターを含むメソッドのみがサポートされており、パラメーターは基本タイプのものではありません。
使用
Spring-BootでAOPを使用する方法は、ここで詳細に説明しません。主にAOPでコアコードを紹介します。
Maven依存関係
スプリングブートの依存関係に加えて、必要なサードパーティの依存関係はコア依存関係ではなく、個人の習慣に従って選択できます。
<! - 文字列検証の場合 - > <依存関係> <groupid> org.apache.commons </groupid> <artifactid> commons-lang3 </artifactid> <バージョン> 3.3.2 </version> </dependency> <! - for log printing-> <deplency> <groupid> org.slf4j <バージョン> 1.7.25 </version> </dependency>
カスタムアノテーション
java.lang.annotation.elementType; Import java.lang.annotation.retention; import java.lang.annotation.target; import static java.lang.annotation.RetentionPolicy.runtime; */@ターゲット({elementType.type、elementType.method})@retention(runtime)public @interface check {//フィールド検証ルール、形式:フィールド名 +検証ルール +コロン +エラーメッセージ、例:ID <10:IDは10文字列[]値()値();}コアコード
@Check Annotationでインターフェイスメソッドを傍受することにより、メソッドが実行される前にパラメーター検証を実行します。エラーメッセージがある場合、直接返されます。
@around(value = "@com.cipher.checker.check")//ここでは、カスタムアノテーションのパスに変更する必要がありますパブリックオブジェクトチェック(ProceedingJoinPoint Point)スロースロー可能{Object OBJ; //パラメーター検証文字列msg = docheck(point); if(!stringutils.isempty(msg)){//ここでは、return class capsulated throw new IllegalargumentException(MSG)を返すことができます。 } obj = point.proceed(); OBJを返します;}docheckメソッドのコア検証方法、主な原則は、注釈で指定されたフィールド名と検証ルールを取得し、反射を通じてパラメーターエンティティの対応するフィールドの値を取得し、次に検証を実行することです。
/***パラメーター検証** @param Point ProceedJoinPoint* @returnエラーメッセージ*/private string docheck(proceedjoinpoint point){//メソッドパラメーター値オブジェクト[] arguments = point.getargs(); //メソッドメソッドを取得する方法= getMethod(point); string methodinfo = stringutils.isempty(method.getname())? "": "while calling" + method.getName();文字列msg = ""; if(ischeck(method、arguments)){check annotation = method.getannotation(check.class); string [] fields = annotation.value();オブジェクトvo = arguments [0]; if(vo == null){msg = "paramはnull"; } else {for(string fields){//フィールドfieldinfo info = resolvefield(field、methodinfo); //フィールドオブジェクト値の値を取得= reflectionutil.invokegetter(vo、info.field); //検証ルールを実行するboolean isvalid = info.optenum.fun.apply(value、info.operatornum); msg = isvalid? msg:info.innermsg; }}} return msg;}主なロジックは次のとおりです。
フィールドを解析 - >フィールドの値を取得 - >検証ルールを実行する
列挙クラスは内部的に維持され、関連する検証操作が指定されています。
/** * Operation enum */enum operator {/** * olver */greate_than( ">"、checkparamaspect :: isgreaterthan)、/** * */greate_than_equal( "> ="、checkparamaspect :: isgreaterthanequal) / ***以下* / less_than_equal( "<="、checkparamaspect :: islessthanequal)、 / ***等しい* / not_equal( "!="、checkparamaspect :: isnotequal)、 / ***空にない* / not_null( "not null"プライベート文字列値。 private bifunction <object、string、boolean> fun; operator(string value、bifunction <object、string、boolean> fun){this.value = value; this.fun = fun; }}スペースの理由により、すべてのコードを1つずつ拡張するわけではありません。興味のある友人は、すべてのソースコードを次のアドレスで入手できます:Ciphermagic/Java-Learn/Sandbox/Checker
トト
やっと
読んでくれてありがとう。それが好きな友達はGithubでそれを好きです。ご質問や提案がある場合は、下にメッセージを残して、返信をお待ちしています。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。