1:Hibernate-Validatorの基本
1。はじめに:
注釈注釈を使用して、クラスまたはクラスの属性に制約を追加することにより、ランタイム中の属性値の合法性を確認します。
2。機能:
パラメーターの検証は、APIインターフェイスの開発において非常に重要です。これは、クライアントがパラメーターを渡すか、値が違法であるか、パラメーター値が悪意があるため、クライアントが送信するパラメーターの合法性を検証する必要があるためです。その中で、注釈を通じてパラメーター値の検証ルールを属性に注釈することは、比較的エレガントな方法です。
3.一般的に使用される制約注釈
4.初めての冬眠validatorを取得します
パブリッククラスアドレス{@notnullプライベート文字列line1;プライベートストリングライン2;プライベートストリングzip;プライベートストリング状態; @length(max = 20)@notnull private string Country; @range(min = -2、max = 50、message = "Floor Out Range")public int Floor; // getter && setter}2:Hibernate-Validatorの検証を統合します
この例は、SpringMVC+FastJSON Integration(//www.vevb.com/article/139094.htm)に基づいて統合されています。まずこの記事(ダウンロード用のソースコードを使用して)を見て、この記事に基づいてHibernate-Validatorを統合できます。
統合ステップ:
1. pom.xmlにHibernate-Validatorの依存関係を紹介します
<Dependency> groupId> org.hibernate </groupId> <artifactid> hibernate-validator </artifactid> <version> 5.4.1.final </version> </dependency>
2。[xxx] -servlet.xml:hibernatevalidatorでバリデーターを構成します
< <value> text/html; charset = utf-8 </value> <value> application/json </value> </list> </property name = "feature"> <value> quotefieldnames </value> <value> writemapnullvalue </value> </list> </property> id = "balidator"> <プロパティ名= "providerclass" value = "org.hibernate.validator.hibernatevalidator"/> <プロパティname = "validationmessagesource" ref = "messagesource"/> </bean> <bean id = "メッセージソース"> <プロパティ名= "basenames" <value> classpath:org/hibernate/validator/validationmessages </value> </list> </property name> <property name = "usecodeasdefaultmessage" value = "false"/> <プロパティname = "defaultencoding" value = "utf-8"/> <property name = "cacheseconds" "60"/>> </bean> </bean>
3.検証メッセージファイルの説明検証を定義します。SRC/Main/Resources/CONF/SETTINGS LOCATIONのプロパティ
validation.common.not.null =このフィールドは空にすることはできませんvalidation.common.not.range = length Illogal Validation.common.format.error =フォーマットエラー検証= Param.age =年齢18歳
4.テスト用の新しいエンティティクラスを作成します
ユーザーエンティティ
パッケージcom.mengdee.manage.validator; import javax.validation.constraints.min; Import javax.validation.constraints.notnull; import javax.validation.constraints.null; Import javax.validation.constraints.pattern; Import org.hibernate.validator.constration.constraints.constraints.constraints.constraintation.constraintatorn. org.hibernate.validator.constraints.Length;import org.hibernate.validator.constraints.NotBlank;public class UserEntity { @Null(groups={GroupA.class}) @NotNull(groups={GroupB.class}) @Min(value = 1, message="id value must be greater than 0", groups={GroupB.class}) private Long id; @notblank(groups = {groupa.class、groupb.class})@pattern(regexp = "^(?![0-9]+$)(?![a-za-z]+$)[0-9a-za-z] {6,20} $"、message = "scompition =" 6-21文字= "純粋な数字または純粋な英語" GroupB.Class})プライベート文字列パスワード。 @notblank(groups = {groupa.class、groupb.class})@pattern(regexp = "^((13 [0-9]))|(15 [^4、// d])|(18 [0,3-9])// d {8} $"、message = "携帯電話番号形式はincorect")prive string phone; @notblank(groups = {groupb.class})@length(min = 6、max = 12、message = "ニックネーム長は6〜12ビット")private string nickname; @min(value = 18、message = "{validation.param.age}")private int age; @notblank(groups = {groupa.class})@email(message = "{validation.common.format.error}")private string email; @notblank @length(min = 3、max = 10、message = "{validation.common.not.range}")private string username; public userentity(){} public long getId(){return id; } public void setid(long id){this.id = id; } public string getnickname(){return nickname; } public void setnickname(string nickname){this.nickname = nickname; } public int getage(){return age; } public void Setage(int age){this.age = age; } public string getemail(){return email; } public void setemail(string email){this.email = email; } public string getPassWord(){パスワードを返します。 } public void setPassword(string password){this.password = password; } public string getUsername(){return username; } public void setUsername(string username){this.username = username; } public string getPhone(){return phone; } public void setPhone(string phone){this.phone = phone; }}usermodel
パッケージcom.mengdee.manage.validator; import javax.validation.constraints.min; Import javax.validation.constraints.pattern; Import org.hibernate.validator.constraints.email; Import org.hibernate.validator.constraint.constraints.lengtator.valnate.valnate.Constraint. @min(value = 1、message = "id値は0より大きくなければなりません")private long id; @notblank @length(min = 6、max = 12、message = "ニックネームの長さは6〜12桁です")プライベート文字列ニックネーム。 @min(value = 18、message = "{validation.param.age}")private int age; @notblank @email(message = "{validation.common.format.error}")private string email; @notblank @pattern(regexp = "^(?![0-9]+$)(?![a-za-z]+$)[0-9a-za-z] {6,20} $"、message = "6-21文字と数字の構成は、純粋な数字または純粋な英語ではありません")プライベート文字列パスワード。 @notblank @length(min = 3、max = 10、message = "{validation.common.not.range}")private string username; @notblank @pattern(regexp = "^((13 [0-9])|(15 [^4、// d])|(18 [0,3-9]))// d {8} $"、message = "携帯電話番号形式は正しくありません")プライベート文字列電話; public usermodel(){} public long getId(){return id; } public void setid(long id){this.id = id; } public string getnickname(){return nickname; } public void setnickname(string nickname){this.nickname = nickname; } public int getage(){return age; } public void Setage(int age){this.age = age; } public string getemail(){return email; } public void setemail(string email){this.email = email; } public string getPassWord(){パスワードを返します。 } public void setPassword(string password){this.password = password; } public string getUsername(){return username; } public void setUsername(string username){this.username = username; } public string getPhone(){return phone; } public void setPhone(string phone){this.phone = phone; }}userdetail:
パッケージcom.mengdee.manage.validator; import org.hibernate.validator.constraints.notblank; public class userdetail {private long id; @notblankプライベート文字列アドレス。 @notblank private string Company; public userdetail(){} public long getId(){return id; } public void setid(long id){this.id = id; } public string getAddress(){return Address; } public void setAddress(stringアドレス){this.address = address; } public string getCompany(){return Company; } public void setcompany(string company){this.company = company; }}有効なコントローラーを使用したテスト
パッケージcom.mengdee.manage.controller; import javax.servlet.http.httpservletrequest; Import javax.validation.Valid; Import org.springframework.stereotype.controller; Import org.springframework.validation.validation.validation. springframework.web.bind.annotation.requestmapping; Import org.springframework.web.bind.annotation.RequestMethod; Import org.springframework.web.bind.Annotation.Annotation.ResponseBody; Import com.mengdee.manage.validator.usmodel; validController拡張basecontroller {// http:// localhost:8081/platform-springmvc-webapp/valid/test?age=18&nickname=mengdee&id=1&email = [email protected]&password=root123&username=123&phone=1831758888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888付け"/test"、method = requestmethod.get)public @responsebodyオブジェクト検証(httpservletrequest request、@valid usermodel user、bindingResult bindingResult){if(bindindResult.haserrors()){fielderror fielderror = bindingResult.getFielderor(); super.responsejsonerror(fielderror)を返します。 } "ok"を返します。 } //複数のオブジェクトを同時に検証する方法では、複数の結果を結合する必要があります。 @validが表示されますが、これは後で宣言されたbindingResultに対応します。 @RequestMapping(value = "/test2"、method = requestmethod.get)public @responsebody object validationmore(httpservletrequest request、@valid usermodel user、bindingResult bindingResult、 @valid userdetail userdetail、bindingResult bindingResult2) BindingResult.getFielderror(); super.responsejsonerror(fielderror)を返します。 } if(bindingResult2.haserrors()){fielderror fielderror = bindingResult2.getFielderror(); super.responsejsonerror(fielderror)を返します。 } "ok"を返します。 }}使用に関するメモ:
1.複数のフィールドの場合、システム検証の順序は、不要であるかのように、フィールド宣言の順序とは異なるようです。
2。各検証について、メッセージ属性がない場合、対応する@NotBlankなど、システムはデフォルトを使用します。
3。文字列などの参照タイプの場合、@NotNull、@NOTEMPTY、または@NotBlankと組み合わせて使用する必要があります。テスト後、空の制約を記述しない場合、このフィールドは検証に参加しません。 @Pattern、@Length、@Emailなどを使用する場合、検証されません。空の制約を使用して制限する必要があります。
@min:int、longなどの基本的なデータ型に使用されます。
@notnull:オブジェクトの値はnullにすることはできません
@NOTEMPTY:コレクションオブジェクトの要素は0ではありません。つまり、コレクションは空ではなく、文字列にも使用できます。
@notblank:nullではなく文字列にのみ使用でき、string trim()の長さは0より大きくなります
3:グループ検証@validated
1。グループ化の役割(シナリオを使用):
各検証アノテーション制約には、制約が属するグループを指定するために使用されるグループ属性があります。このようにして、同じフィールドで複数の制約セットを構成できます。それを使用する場合、使用する制約のセットを指定する必要があります。たとえば、ユーザーを登録してユーザー情報を変更する場合、登録時にIDを空にする必要があり、ユーザー情報を変更するときはIDを空にしてはなりません。それを使用する場合、これら2つの制約を異なるグループに割り当てる必要があります。たとえば、追加するとき、グループAの制約を使用し、更新時にグループBの制約を使用します。
2。パケットは空のインターフェイスです
GroupaおよびGroupB
パッケージcom.mengdee.manage.validator; public interface groupa {}パッケージcom.mengdee.manage.validator; public interface groupb {}@validatedを使用する場合({groupa.class})
3。グループシーケンス@GroupSequence
デフォルトでは、異なるグループの制約検証は順序付けられておらず、グループシーケンスは、GroupAグループの制約を最初に検証したり、GroupBグループの制約を検証したりするなど、順序の前後にグループでシーケンスで検証されます。たとえば、グループの検証順序に要件がある場合は、最初にグループAを検証し、次にグループBを検証する必要があります。
シナリオを使用してください:
(1)2番目のグループの制約検証は、実行するために安定した状態に依存しており、この安定した状態は最初のグループによって検証されています。
(2)特定のグループの検証は時間がかかり、CPUとメモリの使用率は比較的大きいです。最良の選択は、検証のために最後にそれを置くことです。したがって、グループ検証を実行する場合、グループシーケンスの概念を提案する整然とした検証方法がまだ必要です。
グループは他のグループのシーケンスとして定義でき、検証に使用された場合、シーケンスで指定された順序に準拠する必要があります。グループシーケンスの検証を使用する場合、シーケンスの前のグループ検証が失敗した場合、後続のグループは検証されなくなります。
注釈グループシーケンスを使用してグループシーケンスを定義します:GroupAB
パッケージcom.mengdee.manage.validator; import javax.validation.groupsequence; @groupSequence({groupa.class、groupb.class})public interface groupAb {VaridationController
パッケージcom.mengdee.manage.controller; import javax.servlet.http.httpservletrequest; Import org.springframework.stereotype.controller; Import org.springframework.validation.BindingResult; Import org.springframework.validation.validation.fielderror; org.springframework.validation.annotation.validated; Import org.springframework.web.bind.annotation.requestmapping; Import org.springframework.web.notation.requestmethod; import org.springframework.web.bind.nresposons. com.mengdee.validator.groupa;インポートcom.mengdee.manage.valideator.groupab; Import com.mengdee.manage.validator.groupb; Import com.mengdee.manage.validator.usterentity;@controller@requestmapping( "/validated")Public Class extendationControllers basecontrers検証、グループを含む制約のみがチェックされるように。包含がない場合、検証はありません。たとえば、電話の場合、@NotBlankで指定されたグループ、および@Patternがグループを指定しないため、1つの制約のみが空になっています。 RequestMethod.get)public @ResponseBody Object Groupa(httpservletrequest request、@validated({groupa.class})userentity user、bindingResult bindingResult){if(bindingResult.haserrors()){fielderror fielderror = binderult.getfielderror(); this.responsejsonerror(Fielderror)を返します。 } "ok"を返します。 } // http:// localhost:8081/platform-springmvc-webapp/validated/groupb?phone = 123&password = root123&id = 1 @requestmapping(value = "/groupb"、method = requestmethod.get)public @responsebody groupb(httpserquentrequest request、 @validtate({validtate)(utulest) BindingResult BindingResult){if(BindingResult.haserrors()){fielderror fielderror = BindingResult.getFielderror(); this.responsejsonerror(Fielderror)を返します。 } "ok"を返します。 } // groupab // http:// localhost:8081/platform-springmvc-webapp/validated/groupab?phone = 111&password=root123&nickname=123&email = [email protected] // @validated({groupa.class}:cless firly grougs firly firn of firn of firn of firn of firn of firn firn of firn of sign firnデータベース。 1つの条件が満たされている限り、制約が検証されます。複数のグループを同時に使用して、複数のグループ間に順番に属性がないことに注意してください。最初にグループAを検証し、次にグループBを検証することではありません。// IDの制約が空でないため、属性が最初にコメントされます@RequestMapping(value = "/groupAb"、methodmethod.get)public @responsebody object groupab(httpservletrequest request、 @validated({gripa.class、biding、biding request) BindingResult){if(bindingResult.haserrors()){fielderror fielderror = bindingResult.getFielderror(); this.responsejsonerror(Fielderror)を返します。 } "ok"を返します。 } //デフォルト// http:// localhost:8081/platform-springmvc-webapp/default?email = [email protected]&age=18 // @validatedグループが指定されていない場合、グループ属性がないことを確認します(@valid関数と同じように)。フィールドに複数の制約がある場合、グループを指定する必要はありません。指定されたグループが部分的に制約されており、部分的な制約が制約を指定しない場合、 @validated @responsebodyオブジェクトを使用している場合、 @requestmapping(value = "/default"、methodmethod.get)がチェックされません(httpservletrequest request、 @validated userentityユーザー、バインディングユーザー() Fielderror Fielderror = BindingResult.getFielderror(); this.responsejsonerror(Fielderror)を返します。 } "ok"を返します。 } // localhost:8081/platform-springmvc-webapp/validated/sequence?phone = 123&password = root123&email = 123&nickname = 123 //プロパティの複数の制約については、同じグループのすべてではなく、チェックの順序は= segape = secape = segace = segace = segace = segace = segape = segace = secience = secienceの順序に従ってチェックされます。 RequestMethod.get)public @responsebodyオブジェクトシーケンス(httpservletrequest request、@validated({groupab.class})userentity user、bindingResult bindingResult){if(bindingResult.haserrors()){fielderror fielderror = binderult.getfielderror(); this.responsejsonerror(Fielderror)を返します。 } "ok"を返します。 }}4:カスタムHibernate Validation Annotation
Hibernate検証によって提供された注釈が要件を満たすことができない場合、検証制約をカスタマイズできます。
カスタム注釈制約手順:
Annotation @Phoneを作成します
パッケージcom.mengdee.manage.validator; import java.lang.annotation.target; Import javax.validation.constraint; Import javax.validation.payload; import static java.lang.annotation.ElementType.annotation_type; Java.lang.Annotation.ElementType.Field; Import Static Java.lang.Annotation.ElementType.Method; Import Static Java.lang.Annotation.ElementType.Parameter; Import Static Java.Lang.Annotation.RetentionPolicy.Runtime; Import java.lang.annotation.documented; java.lang.annotation.retention; @target({method、field、annotation_type、constructor、parameter})@retention(runtime)@documented@constraint(validatedby = {phoneconstraint.class})public @interface phone {default bolion電話番号 "; string regexp()default "^((13 [0-9])|(15 [^4、// d])|(18 [0,3-9])// d {8} $"; class <?> [] groups()default {};クラス<?ペイロード> [] payload()default {}; @target({method、field、annotation_type、constructor、parameter})@retention(runtime)@documented public @interface list {phone [] value(); }}携帯電話番号の注釈に対応する制約検証クラスを作成する
パッケージcom.mengdee.manage.validator; import javax.validation.constraintvalidator; Import javax.validation.constraintalidatorContext;パブリッククラスのPhoneconstraintiment constraintvalidator <phone、string> {private string regexp; {private string regexp; @Override public void initialize(電話phoneannotation){this.regexp = phoneannotation.regexp(); } @Override public boolean isvalid(string value、constraintValidatorContextコンテキスト){if(value == null){return true; // hv000028:isvalidコール中の予期しない例外} if(value.matches(regexp)){return true; } falseを返します。 }}属性でannotation @Phoneを使用します
パッケージcom.mengdee.manage.validator; Import org.hibernate.validator.constraints.notblank; public class userdetail {@notblank @phone private string phone; public userdetail(){} public string getPhone(){return phone; } public void setPhone(string phone){this.phone = phone; }}テストノート
// http:// localhost:8081/platform-springmvc-webapp/valid/test3?address = 123&company = 456&phone = 123 @requestmapping(value = "/test3"、method = requestmethod.get)public @responsebody object obgent BindingResult){if(bindingResult.haserrors()){fielderror fielderror = bindingResult.getFielderror(); super.responsejsonerror(fielderror)を返します。 } "ok"を返します。 }完全なコードをダウンロード:http://xiazai.vevb.com/201804/yuanma/platform-springmvc-webapp(vevb.com).rar
要約します
上記は、この記事のコンテンツ全体です。この記事の内容には、すべての人の研究や仕事に特定の参照値があることを願っています。ご質問がある場合は、メッセージを残してコミュニケーションをとることができます。 wulin.comへのご支援ありがとうございます。
参照記事: