JSR 303 - Bean Validation 簡介及使用方法

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。

一、JSR-303簡介

JSR-303 是 JAVA EE 6 中的一項子規范,叫做 Bean Validation,官方參考實現是Hibernate Validator。

此實現與 Hibernate ORM 沒有任何關系。 JSR 303 用于對 Java Bean 中的字段的值進行驗證。?
Spring MVC 3.x 之中也大力支持 JSR-303,可以在控制器中對表單提交的數據方便地驗證。?
注:可以使用注解的方式進行驗證

二、準備校驗時使用的JAR

validation-api-1.0.0.GA.jar:JDK的接口;?
hibernate-validator-4.2.0.Final.jar是對上述接口的實現;?
log4j、slf4j、slf4j-log4j

三、JSR 303 基本的校驗規則

空檢查?
@Null 驗證對象是否為null?
@NotNull 驗證對象是否不為null, 無法查檢長度為0的字符串?
@NotBlank 檢查約束字符串是不是Null還有被Trim的長度是否大于0,只對字符串,且會去掉前后空格.?
@NotEmpty 檢查約束元素是否為NULL或者是EMPTY.

Booelan檢查?
@AssertTrue 驗證 Boolean 對象是否為 true?
@AssertFalse 驗證 Boolean 對象是否為 false

長度檢查?
@Size(min=, max=) 驗證對象(Array,Collection,Map,String)長度是否在給定的范圍之內?
@Length(min=, max=) Validates that the annotated string is between min and max included.

日期檢查?
@Past 驗證 Date 和 Calendar 對象是否在當前時間之前,驗證成立的話被注釋的元素一定是一個過去的日期?
@Future 驗證 Date 和 Calendar 對象是否在當前時間之后 ,驗證成立的話被注釋的元素一定是一個將來的日期?
@Pattern 驗證 String 對象是否符合正則表達式的規則,被注釋的元素符合制定的正則表達式,regexp:正則表達式 flags: 指定 Pattern.Flag 的數組,表示正則表達式的相關選項。

數值檢查?
建議使用在Stirng,Integer類型,不建議使用在int類型上,因為表單值為“”時無法轉換為int,但可以轉換為Stirng為”“,Integer為null?
@Min 驗證 Number 和 String 對象是否大等于指定的值?
@Max 驗證 Number 和 String 對象是否小等于指定的值?
@DecimalMax 被標注的值必須不大于約束中指定的最大值. 這個約束的參數是一個通過BigDecimal定義的最大值的字符串表示.小數存在精度?
@DecimalMin 被標注的值必須不小于約束中指定的最小值. 這個約束的參數是一個通過BigDecimal定義的最小值的字符串表示.小數存在精度?
@Digits 驗證 Number 和 String 的構成是否合法?
@Digits(integer=,fraction=) 驗證字符串是否是符合指定格式的數字,interger指定整數精度,fraction指定小數精度。?
@Range(min=, max=) 被指定的元素必須在合適的范圍內?
@Range(min=10000,max=50000,message=”range.bean.wage”)?
@Valid 遞歸的對關聯對象進行校驗, 如果關聯對象是個集合或者數組,那么對其中的元素進行遞歸校驗,如果是一個map,則對其中的值部分進行校驗.(是否進行遞歸驗證)?
@CreditCardNumber信用卡驗證?
@Email 驗證是否是郵件地址,如果為null,不進行驗證,算通過驗證。?
@ScriptAssert(lang= ,script=, alias=)?
@URL(protocol=,host=, port=,regexp=, flags=)

四、案例分析

在使用的時候直接對JavaBean進行注解既可以實現對屬性的驗證

public class Order {// 必須不為 null, 大小是 10@NotNull@Size(min = 10, max = 10)private String orderId;// 必須不為空@NotEmptyprivate String customer;// 必須是一個電子信箱地址@Emailprivate String email;// 必須不為空@NotEmptyprivate String address;// 必須不為 null, 必須是下面四個字符串'created', 'paid', 'shipped', 'closed'其中之一// @Status 是一個定制化的 contraint@NotNull@Statusprivate String status;// 必須不為 null@NotNullprivate Date createDate;// 嵌套驗證@Validprivate Product product;// getter 和setter方法
}

?

又例:

?

 @NotNull(message = "adultTax不能為空")private Integer adultTax;@NotNull(message = "adultTaxType不能為空")@Min(value = 0, message = "adultTaxType 的最小值為0")@Max(value = 1, message = "adultTaxType 的最大值為1")private Integer adultTaxType;@NotNull(message = "reason信息不可以為空")@Pattern(regexp = "[1-7]{1}", message = "reason的類型值為1-7中的一個類型")private String reason;//訂單取消原因

?

五、下邊是一個完整的例子:

?

public class ValidateTestClass{@NotNull(message = "reason信息不可以為空")@Pattern(regexp = "[1-7]{1}", message = "reason的類型值為1-7中的一個類型")private String reason;//訂單取消原因//get、set方法、有參構造方法、無參構造方法、toString方法省略/*** 驗證參數:就是驗證上述注解的完整方法* @return*/public void validateParams() {//調用JSR303驗證工具,校驗參數Validator validator = Validation.buildDefaultValidatorFactory().getValidator();Set<ConstraintViolation<ValidateTestClass>> violations = validator.validate(this);Iterator<ConstraintViolation<ValidateTestClass>> iter = violations.iterator();if (iter.hasNext()) {String errMessage = iter.next().getMessage();throw new ValidationException(errMessage);}}
}

?

?

?

我們可以寫一個測試類進行驗證:

public class ValidateTestClassValidateTest{@Testpublic void validateParam(){ValidateTestClass validateTestClass = new ValidateTestClass();validateTestClass .setReason(12);validateTestClass .validateParams(); //調用驗證的方法}
}

?

就可以進行測試。

?

并且我們在使用的時候一定要注意,對于某一種驗證規則是適用于一種數據類型的,簡單說來,正則則表達式的驗證對象可以為String類型的,但是不可以為Integer類型的數據,那么當我們使用正則表達式進行驗證的時候就會出現錯誤。?

類似于:

javax.validation.UnexpectedTypeException: HV000030: No validator could be found for type: java.lang.Integer.
at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintValidatorManager.verifyResolveWasUnique(ConstraintValidatorManager.java:218)

?

  • ?

?

意思就是你這個驗證的注解不應該對該類型進行注解。

到此OK。

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/449746.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/449746.shtml
英文地址,請注明出處:http://en.pswp.cn/news/449746.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

POJ 3683 Priest John's Busiest Day(2-ST)

題目鏈接&#xff1a;http://poj.org/problem?id3683 題意&#xff1a;有n個婚禮要舉行&#xff0c;但是只有一個牧師。第i個婚禮使用牧師的時間長為leni&#xff0c;可以在開始時或結束時使用。問能否使得n個婚禮均舉行&#xff1f; 思路:對于婚禮i&#xff0c;i*2-1表示在開…

12個git實戰建議和技巧

摘要&#xff1a;git無疑是現在最熱門的版本控制工具&#xff0c;而且正在進一步侵占SVN以及CVS的市場。本文作者從國外技術問答社區Stack Overflow整理的12個很實用的git使用技巧和建議&#xff0c;希望對你有幫助。 1.使用“git diff”來折疊多行 用git diff經常會出現很多內…

python讀寫json和txt

讀寫json #數據保存如json文件 import json jsObj json.dumps(code_sec) fileObject open(jsonFile.json, w) fileObject.write(jsObj) fileObject.close() #讀取json文件 # 將類文件對象中的JSON字符串直接轉換成 Python 字典 with open(jsonFile.json, r, encoding…

Java 12 將于3月19日發布,8 個最終 JEP 一覽

開發四年只會寫業務代碼&#xff0c;分布式高并發都不會還做程序員&#xff1f; JDK 12 已于2018年12月進入 Rampdown Phase One 階段&#xff0c;這意味著該版本所有新的功能特性被凍結&#xff0c;不會再加入更多的 JEP 。該階段將持續一個月&#xff0c;主要修復 P1-P3 級…

股票期貨數據的resample處理

? import pandas as pd stock_day pd.read_csv("stock_day.csv") stock_day stock_day.sort_index() # 對每日交易數據進行重采樣 &#xff08;頻率轉換&#xff09; stock_day.index# 1、必須將時間索引類型轉換成Pandas默認的類型 stock_day.index pd.to_datet…

ArcEngine調用FeatureToLine工具傳參問題

FeatureToLine工具的in_features參數不能為內存圖層&#xff0c;否則會報內存錯誤&#xff0c;正確的寫法如下&#xff1a; FeatureToLine ftrToLine new FeatureToLine(); ftrToLine.in_features cpj.TempWs.PathName "\OriginDataset\" currentFc.Key; ftrToLi…

程序員如何做出“不難看”的設計

摘要&#xff1a;程序員在寫代碼的時候往往只注重功能的實現和性能的提升&#xff0c;忽視了外觀和易用性&#xff0c;其實很多時候只要注意一些基本的規則&#xff0c;就可以大幅度提高產品的觀感。 經常看到程序員展示自己做的東西&#xff0c;有一些是創業項目&#xff0c;有…

微服務實戰(二):使用API Gateway

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 當你決定將應用作為一組微服務時&#xff0c;需要決定應用客戶端如何與微服務交互。在單體式程序中&#xff0c;通常只有一組冗余的或者…

sql數據庫挖坑

sql數據庫存入數據時&#xff0c;因為列 名不允許有括號&#xff0c;無法識別&#xff0c;需要對括號進行剔除 df df.rename(columnslambda x: x.replace("(","").replace(),))

力扣——頂端迭代器

給定一個迭代器類的接口&#xff0c;接口包含兩個方法&#xff1a; next() 和 hasNext()。設計并實現一個支持 peek() 操作的頂端迭代器 -- 其本質就是把原本應由 next() 方法返回的元素 peek() 出來。 示例: 假設迭代器被初始化為列表 [1,2,3]。調用 next() 返回 1&#xff0c…

五步讓你成為專家級程序員

摘要&#xff1a;Mark Lassoff是一位高級技術培訓師&#xff0c;從事培訓工作已有10余年。他培訓的客戶包括美國國防部、Lockheed Martin等。在多年的培訓生涯中&#xff0c;他總結了一些如何快速學習一門語言的技巧&#xff0c;這些技巧非常簡單&#xff0c;但是卻讓人受益匪淺…

Ionic混合移動app框架學習

第一章 緒論創建移動app有三種安卓原生App&#xff0c;使用java語言&#xff0c;目前推薦kotlin語言&#xff0c;開發工具Android studioIOS原生App&#xff0c;使用Objective-C或者Swift語言&#xff0c;開發工具Xcode混合移動App&#xff0c;使用web通用語言&#xff08;HTML…

IPC 中 LPC、RPC 的區別和聯系

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 進程間通信&#xff08;IPC&#xff0c;Inter-Process Communication&#xff09;&#xff0c;指至少兩個進程或線程間傳送數據或信號的…

Laravel 使用 Aliyun OSS 云存儲

對象存儲 ( Object Storage Service, 簡稱 OSS ) OSS 相信大家都聽過, 它是阿里云對外提供的海量, 安全和高可靠的云存儲服務. 大家可以把自己網站的資源存上面加快自己網站速度, aliyun 官網也有文檔不過對于新手來說有點難, 那么這里我給大家推薦一個組件和組件的使用. johnl…

python多級索引修改

創建多級索引 cols pd.MultiIndex.from_tuples([("a","b"), ("a","c")]) pd.DataFrame([[1,2], [3,4]], columnscols) abc012134 df.columns df.columns.droplevel() df bc012134

在線學習新編程 技巧全攻略

摘要&#xff1a;有句俗語叫&#xff1a;“技多不壓身”&#xff0c;如果你有時間和興趣&#xff0c;不妨多了解和掌握編程技能&#xff0c;或許隨時可能有用。本文為你收集了一些編程技巧&#xff0c;讓你輕松學編程。 有句俗語叫&#xff1a;“技多不壓身”&#xff0c;如果你…

第 3 章 鏡像 - 018 - 鏡像命名的最佳實踐

為鏡像命名 創建鏡像時 docker build 命令時已經為鏡像取了個名字&#xff0c;例如&#xff1a; docker build -t ubuntu-with-vi 這里的 ubuntu-with-vi 就是鏡像的名字。通過 dock images 可以查看鏡像的信息。 1 rootubuntu:~# docker images ubuntu-with-vi 2 REPOSITORY …

Jmeter邏輯控制器-ForEach Controller

ForEach Controller 介紹 ForEach Contoller 即循環控制器&#xff0c;顧名思義是定義一個規則。主要有以下一個參數&#xff1a;名稱&#xff1a;隨便填寫注釋&#xff1a;隨便填寫輸入變量前綴&#xff1a;可以在“用戶自定義變量”中定義一組變量。循環控制器可以從中獲取到…

微服務實戰(三):深入微服務架構的進程間通信

見&#xff1a;http://www.dockone.io/article/549簡介 在單體式應用中&#xff0c;各個模塊之間的調用是通過編程語言級別的方法或者函數來實現的。但是一個基于微服務的分布式應用是運行在多臺機器上的。一般來說&#xff0c;每個服務實例都是一個進程。因此&#xff0c;如下…

python輸出與刪除某行或某列

python輸出字符&#xff0c;主要為結合變量形成新的變量名 year 2016 event Referendum fResults of the {year} {event}Results of the 2016 Referendum yes_votes 42_572_654 no_votes 43_132_495 percentage yes_votes / (yes_votes no_votes) {:-9} YES votes {:2…