導入
SpringMVCをWeb開発のコントローラーレイヤーとして使用する場合、コントローラーのメソッドのパラメーターチェックを実行する必要があることがよくあります。もともと、SpringMVCには、パラメーターをチェックするために使用できる2つの注釈@validと@validated Annotationsが付属していますが、パラメーターが豆である場合にのみ確認できます。文字列または長いものには適用されません。これらの2つの注釈が突然失敗することがあります(理由は慎重に調査されていません)。この点で、SpringのAOPとカスタムアノテーションを使用して、パラメーター検証関数を自分で記述できます。
コードの例
注:このセクションのコードは単なるデモンストレーションであり、完全な解決策ではなく、実行可能なアイデアを提供します。
このプロジェクトは、Spring、SpringMVC、Maven、JDK1.8の使用されているシンプルなWebプロジェクトです。
プロジェクト構造:
カスタムアノテーション:
validparam.java:
パッケージcom.lzumetal.sssm.paramcheck.annotation; import java.lang.annotation。
notnull.java:
パッケージcom.lzumetal.sssm.paramcheck.annotation; import java.lang.annotation。*;@target({elementtype.field、elementtype.parameter})@retention(retentionpolicy.runtime)@documentedpublic @interface notnull {String msg( }notempty.java:
パッケージcom.lzumetal.ssm.paramcheck.annotation; import java.lang.annotation。*;@target({elementtype.field、elementtype.parameter})@retention(retentionpolicy.runtime)@documentedpublic @interface nokempty {String msg( }フェイスカット
paramcheckaspect.java:
パッケージcom.lzumetal.ssm.paramcheck.aspect; import com.lzumetal.sssm.m.m.m.paramcheck.annotation.notempty; Import com.lzumetal.lzumetal.lzmetal.ssm.paramcheck.annotation.notnull; Import com.lzumetal.ssssm.paramcheck.annotation.validparam; org.apache.commons.lang3.stringutils; Import org.aspectj.lang.joinpoint; Import org.aspectj.lang.annotation.aspect; Import org.aspectj.lang.annotation.before; import org.aspectj.lang.reflect.methodsignature; import.springframework.strimework.string.string.string.string.string.spring.springframework javax.servlet.http.httpservletrequest; import javax.servlet.httpservletresponse; Import javax.servlet.httpservletResponse; Import javax.servlet.http.httpsession; Java.lang.Reflect.Parameter; Import Java.util.arrays;/***パラメーターチェックファセットクラス*/@aspeentPublic@componentPublic class paramcheckaspect {"execution(*com.lzumetal.ssss.m.paramcheck.controller object [] args = joinpoint.getargs(); //メソッドパラメーターを取得Methodignature signature =(methodignature)Joinpoint.getSignature(); parameter [] parameters = signature.getMethod()。getParameters(); for(int i = 0; i <parameters.length; i ++){parameter parameter = parameters [i]; // Java独自の基本的なタイプのパラメーター(整数、文字列など)が処理されます(parameter.getType())){notnull notnull = parameter.getAnnotation(notnull.class); if(notnull!= null && args [i] == null){throw new runtimeexception(parameter.tostring() + notnull.msg()); } // todo続行; } /** @validparamアノテーションがマークされていない場合、またはhttpservletrequest、httpservletresponse、またはhttpsessionが行われない場合、処理は行われません* / if(parameter.getType()。 parameter.getType()。isassignable from(httpsession.class)||。 } class <?> paramclazz = parameter.getType(); //タイプに対応するパラメーターオブジェクトを取得します。実際のプロジェクトのコントローラーのインターフェイスは、同じカスタムタイプの2つのパラメーターを渡さないため、ここではindfirst()を直接使用してください。 object arg = arrays.stream(args).filter(ar-> paramclazz.isassignablefrom(ar.getClass())。 //パラメーターフィールドのすべてのメンバー変数を取得します[] declaredfields = paramclazz.getDeclaredfields(); for(フィールドフィールド:declaredfields){field.setAccessible(true); // @notnull notnull = field.getAnnotation(notnull.class)でマークされたフィールドを確認します。 if(notnull!= null){object fieldvalue = field.get(arg); if(fieldvalue == null){new nup runtimeException(field.getName() + notnull.msg()); }} // @notempty annotationでマークされたフィールドを確認してください、Notemptyは文字列型Notempty notempty = field.getannotation(notempty.class)でのみ使用されます。 if(notempty!= null){if(!string.class.isassignablefrom(field.getType())){new new runtimeException( "間違ったフィールドクラスで使用しているnotempty annotation"); } string fieldstr =(string)field.get(arg); if(stringutils.isblank(fieldstr)){throw new runtimeexception(field.getName() + notempty.msg()); }}}}}} /** *基本的なタイプかどうかを判断します:string * @param clazz clazz * @return true:yes; false:not */ private boolean isprimite(class <?> clazz){return clazz.isprimitive()|| clazz == string.class; }}パラメーターJavabean
StudentParam.java:
パッケージcom.lzumetal.ssm.paramcheck.requestparam; Import com.lzumetal.sss.m.paramcheck.annotation.notempty; Import com.lzumetal.sssm.paramcheck.annotation.notnull; Public Class StudentParam {@notnull private Integer id;民間整数年齢; @notemptyプライベート文字列名; //取得、セットメソッド省略...}パラメーター検証を確認するためのコントローラー
testController.java:
パッケージcom.lzumetal.sssm.paramcheck.controller; import com.google.gson.gson; Import com.lzumetal.sssss.annotation.notnull; Import com.lzumetal.sssm.paramcheck.annotation.antation.validparam; import com.lzetal org.springframework.controller; Import org.springframework.web.bind.annotation.Requestmapping; Import org.springframework.web.bind.annotation.RequestMethod; Import org.springframework.web.bind.respublerpublpublerpublerpublcnotmerpubltccontred.bind.notation static gson gson = new gson(); @ResponseBody @RequestMapping(value = "/test"、method = requestmethod.post)public sustentparam checkparam(@validparam studentparam param、@notnull integer lime){system.out.println(gson.tojson(param)); system.out.println(lime); PARAMを返します。 }}このセクションのサンプルコードは、githubにアップロードされています:https://github.com/liaosilzu2007/ssm-parent.git
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。