@NotNull和@NonNull區(qū)別和使用

@NotNull使用在Bean的字段注解中隙券。它是 JSR303(Bean的校驗框架)的注解,在controller的方法中驗證時(運行時檢查一個屬性是否為空)使用或颊,如果不合法(為空)绪商,注解中的提示信息會保存在result中咪奖。

@NonNull 在方法或構造函數(shù)的參數(shù)上使用,生成一個空值檢查語句治筒。用于指明所修飾的參數(shù)屉栓,字段或方法的值不可以為null。它是JSR 305(缺陷檢查框架)的注解耸袜,是告訴編譯器這個域不可能為空友多,當代碼檢查(靜態(tài)檢查)有空值時會給出一個風險警告。運行時不報任何警告堤框,根據(jù)實際值得情況運行時可能出現(xiàn)空指針異常域滥。 目前這個注解只有IDEA支持。實際好多靜態(tài)掃描工具中有此注解符號

例如:

public class User implements Serializable {
//主鍵
@NotNull(message = "primary is not null",groups = {GroupInterface1.class})
private Long id;

@Pattern(regexp = "[0123456789]",groups = {GroupInterface1.class,GroupInterface2.class},message = "hava a error Date")
private Long maxDiscountAmount;

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTime;

@Future(message = "expireTime is not less than now",groups = {GroupInterface1.class,GroupInterface2.class})
@NotNull(message = "expireTime is not null",groups = {GroupInterface1.class,GroupInterface2.class})
private Date expireTime;
}

import java.util.Date;
import javax.validation.constraints.DecimalMax;
import javax.validation.constraints.DecimalMin;
import javax.validation.constraints.Email;
import javax.validation.constraints.Future;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import org.hibernate.validator.constraints.Range;
import org.springframework.format.annotation.DateTimeFormat;

/**** imports ****/
public class ValidatorPojo {
// 非空判斷
@NotNull(message = "id不能為空")
private Long id;

@Future(message = "需要一個將來日期") // 只能是將來的日期
// @Past //只能去過去的日期
@DateTimeFormat(pattern = "yyyy-MM-dd") // 日期格式化轉換
@NotNull // 不能為空
private Date date;

@NotNull // 不能為空
@DecimalMin(value = "0.1") // 最小值0.1元
@DecimalMax(value = "10000.00") // 最大值10000元
private Double doubleValue = null;

@Min(value = 1, message = "最小值為1") // 最小值為1
@Max(value = 88, message = "最大值為88") // 最大值88
@NotNull // 不能為空
private Integer integer;

@Range(min = 1, max = 888, message = "范圍為1至888") // 限定范圍
private Long range;

// 郵箱驗證
@Email(message = "郵箱格式錯誤")
private String email;

@Size(min = 20, max = 30, message = "字符串長度要求20到30之間蜈抓。")
private String size;

public Long getId() {
    return id;
}

public void setId(Long id) {
    this.id = id;
}

public Date getDate() {
    return date;
}

public void setDate(Date date) {
    this.date = date;
}

public Double getDoubleValue() {
    return doubleValue;
}

public void setDoubleValue(Double doubleValue) {
    this.doubleValue = doubleValue;
}

public Integer getInteger() {
    return integer;
}

public void setInteger(Integer integer) {
    this.integer = integer;
}

public Long getRange() {
    return range;
}

public void setRange(Long range) {
    this.range = range;
}

public String getEmail() {
    return email;
}

public void setEmail(String email) {
    this.email = email;
}

public String getSize() {
    return size;
}

public void setSize(String size) {
    this.size = size;
}

/**** setter and getter ****/

}

此時controller應該要加上@Valid ,否則不會驗證!

/***
* 解析驗證參數(shù)錯誤
* @param vp —— 需要驗證的POJO启绰,使用注解@Valid 表示驗證
* @param errors  錯誤信息,它由Spring MVC通過驗證POJO后自動填充
* @return 錯誤信息Map
*/

@RequestMapping(value = "/valid/validate")
@ResponseBody
public Map<String, Object> validate(
        @Valid @RequestBody ValidatorPojo vp, Errors errors) {
    Map<String, Object> errMap = new HashMap<>();
    // 獲取錯誤列表
    List<ObjectError> oes = errors.getAllErrors();
    for (ObjectError oe : oes) {
        String key = null;
        String msg = null;
        // 字段錯誤
        if (oe instanceof FieldError) {
            FieldError fe = (FieldError) oe;
            key = fe.getField();// 獲取錯誤驗證字段名
        } else {
            // 非字段錯誤
            key = oe.getObjectName();// 獲取驗證對象名稱
        }

        // 錯誤信息
        msg = oe.getDefaultMessage();
        errMap.put(key, msg);
    }
    return errMap;
}

除了@NotNull沟使,還有其他類似的注解委可,已顯示在例子中
@Null 被注釋的元素必須為null
@NotNull 被注釋的元素不能為null,可以為空字符串
@AssertTrue 被注釋的元素必須為true
@AssertFalse 被注釋的元素必須為false
@Min(value) 被注釋的元素必須是一個數(shù)字腊嗡,其值必須大于等于指定的最小值
@Max(value) 被注釋的元素必須是一個數(shù)字着倾,其值必須小于等于指定的最大值
@DecimalMin(value) 被注釋的元素必須是一個數(shù)字,其值必須大于等于指定的最小值
@DecimalMax(value) 被注釋的元素必須是一個數(shù)字叽唱,其值必須小于等于指定的最大值
@Size(max,min) 被注釋的元素的大小必須在指定的范圍內屈呕。
@Digits(integer,fraction) 被注釋的元素必須是一個數(shù)字,其值必須在可接受的范圍內
@Past 被注釋的元素必須是一個過去的日期
@Future 被注釋的元素必須是一個將來的日期
@Pattern(value) 被注釋的元素必須符合指定的正則表達式棺亭。
@Email 被注釋的元素必須是電子郵件地址
@Length 被注釋的字符串的大小必須在指定的范圍內
@Range 被注釋的元素必須在合適的范圍內
@NotEmpty:用在集合類上虎眨,不能為null,并且長度必須大于0
@NotBlank:只能作用在String上,不能為null嗽桩,而且調用trim()后岳守,長度必須大于0


在構造器使用

public User(@NonNull String name) {
    this.name=name;
}

new User(null);//靜態(tài)檢查會報警告,運行時若使用了name的方法碌冶,會報異常

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末湿痢,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子扑庞,更是在濱河造成了極大的恐慌譬重,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件罐氨,死亡現(xiàn)場離奇詭異臀规,居然都是意外死亡,警方通過查閱死者的電腦和手機栅隐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進店門塔嬉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人租悄,你說我怎么就攤上這事谨究。” “怎么了泣棋?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵胶哲,是天一觀的道長。 經(jīng)常有香客問我外傅,道長纪吮,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任萎胰,我火速辦了婚禮碾盟,結果婚禮上,老公的妹妹穿的比我還像新娘技竟。我一直安慰自己冰肴,他們只是感情好,可當我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布榔组。 她就那樣靜靜地躺著熙尉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪搓扯。 梳的紋絲不亂的頭發(fā)上检痰,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天,我揣著相機與錄音锨推,去河邊找鬼铅歼。 笑死公壤,一個胖子當著我的面吹牛,可吹牛的內容都是我干的椎椰。 我是一名探鬼主播厦幅,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼慨飘!你這毒婦竟也來了确憨?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤瓤的,失蹤者是張志新(化名)和其女友劉穎休弃,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體堤瘤,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡玫芦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了本辐。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡医增,死狀恐怖慎皱,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情叶骨,我是刑警寧澤茫多,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站忽刽,受9級特大地震影響天揖,放射性物質發(fā)生泄漏。R本人自食惡果不足惜跪帝,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一今膊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧伞剑,春花似錦斑唬、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至抒倚,卻和暖如春褐着,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背托呕。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工含蓉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留频敛,地道東北人。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓谴餐,卻偏偏與公主長得像姻政,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子岂嗓,可洞房花燭夜當晚...
    茶點故事閱讀 44,901評論 2 355

推薦閱讀更多精彩內容