解讀@NotNull和@NonNull的區(qū)別及使用
@NotNull和@NonNull區(qū)別及使用
區(qū)別
@NotNull在類(lèi)字段中使用,表示該字段不能為空。它是 JSR303(Bean的校驗(yàn)框架)的注解。
在調(diào)用controller的方法中加入@Valid就可以驗(yàn)證該方法參數(shù)中該類(lèi)的對(duì)應(yīng)屬性是否為空,如果為空,注解中的提示信息會(huì)保存在result中。
@NonNull在方法或構(gòu)造函數(shù)的參數(shù)上使用,表示該參數(shù)不能為空。
@NotNull使用
/** ?* user類(lèi) ?*/ @Data public class User { ? ? private int id; ? ? @NotNull(message = "babyId不能為空") ? ? private String babyId; } /** ?* controller的方法 ?* controller方法要加上@Valid ,表示需要驗(yàn)證! ?*/ ?@PostMapping("getMyUser") ?@ResponseBody ?public Baby getBaby(@Valid @RequestBody User user){ ??? ?return babyService.getBabyById(user.getBabyId()); ?}
此時(shí)調(diào)用controller的getBaby方法時(shí)如果user中babyId為空,那么程序會(huì)報(bào)MethodArgumentNotValidException
獲取錯(cuò)誤信息
將上面的getBaby改為下面的例子:
@PostMapping("getMyUser") @ResponseBody public Baby getBaby(@Valid @RequestBody User user,Errors errors){ ? ? List<ObjectError> oes = errors.getAllErrors(); ? ? for (ObjectError oe : oes) { ? ? ? ? String key = null; ? ? ? ? String msg = null; ? ? ? ? // 字段錯(cuò)誤 ? ? ? ? if (oe instanceof FieldError) { ? ? ? ? ? ? FieldError fe = (FieldError) oe; ? ? ? ? ? ? key = fe.getField();// 獲取錯(cuò)誤驗(yàn)證字段名 ? ? ? ? } else { ? ? ? ? ? ? // 非字段錯(cuò)誤 ? ? ? ? ? ? key = oe.getObjectName();// 獲取驗(yàn)證對(duì)象名稱 ? ? ? ? } ? ? ? ? // 錯(cuò)誤信息 ? ? ? ? msg = oe.getDefaultMessage(); ? ? ? ? System.out.println("key:"+key+";msg="+msg); ? ? } ? ? return babyService.getBabyById(user.getBabyId()); }
此時(shí)程序不會(huì)報(bào)錯(cuò),但是可以獲取錯(cuò)誤信息:
key:babyId;msg=babyId不能為空
其他注解及解釋
除了@NotNull,還有其他類(lèi)似的注解,都是在類(lèi)字段上使用
@Null
被注釋的元素必須為null@NotNull
被注釋的元素不能為null,可以為空字符串
*@AssertTrue
被注釋的元素必須為true
*@AssertFalse
被注釋的元素必須為false
*@Min(value)
被注釋的元素必須是一個(gè)數(shù)字,其值必須大于等于指定的最小值
*@Max(value)
被注釋的元素必須是一個(gè)數(shù)字,其值必須小于等于指定的最大值
*@DecimalMin(value)
被注釋的元素必須是一個(gè)數(shù)字,其值必須大于等于指定的最小值
*@DecimalMax(value)
被注釋的元素必須是一個(gè)數(shù)字,其值必須小于等于指定的最大值
*@Size(max,min)
被注釋的元素的大小必須在指定的范圍內(nèi)。
*@Digits(integer,fraction)
被注釋的元素必須是一個(gè)數(shù)字,其值必須在可接受的范圍內(nèi)
*@Past
被注釋的元素必須是一個(gè)過(guò)去的日期
*@Future
被注釋的元素必須是一個(gè)將來(lái)的日期
*@Pattern(value)
被注釋的元素必須符合指定的正則表達(dá)式。
*@Email
被注釋的元素必須是電子郵件地址
*@Length
被注釋的字符串的大小必須在指定的范圍內(nèi)
*@Range
被注釋的元素必須在合適的范圍內(nèi)
*@NotEmpty
:用在集合類(lèi)上,不能為null,并且長(zhǎng)度必須大于0
*@NotBlank
:只能作用在String上,不能為null,而且調(diào)用trim()后,長(zhǎng)度必須大于0
@NonNull使用
@Override @Transactional public Baby getBabyById(@NonNull String babyId) { ? ? return babyMapper.getBabyById(babyId); }
如果 babyId 為空getBabyById會(huì)報(bào)NullPointerException
Java中容易混淆的一些知識(shí)
@NotNull、@NotEmpty、@NotBlank、@NonNull、@Nollable區(qū)分
注解 | 解釋 |
---|---|
@NotNull | 只能用在基本類(lèi)型之上,不能為空,但可以是空字符串 |
@NotEmpty | 只能作用在集合上,可以為空,但是不可以為空字符串 |
@NotBlank | 只能作用在String類(lèi)型上,而且調(diào)用trim()之后,長(zhǎng)度必須大于零 |
@NonNull | 作用在方法參數(shù)上,為空的話,會(huì)生成一個(gè)控制檢查語(yǔ)句(檢查語(yǔ)句可以自定義) |
@Nollable | 作用在參數(shù)上,表示可以為空 |
@GetMapping、@PostMapping、@RequestMapping,如果不清楚用哪個(gè),就用@RequestMapping,一般公司所用就是@PostMapping
注解 | 解釋 |
---|---|
@GetMapping | 接收的就是Get方法 |
@PostMapping | 接收的Post方法 |
@RequestMapping | 它默認(rèn)的Get和Set方法都支持的 |
@Valid、@Validated,檢測(cè)傳參是否規(guī)范。
注解 | 解釋 |
---|---|
@Valid | 作用在方法、字段、參數(shù)和構(gòu)造器上 |
@Validated | 作用在類(lèi)、方法、參數(shù) |
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot實(shí)現(xiàn)圖片識(shí)別文字的四種方式小結(jié)
本文主要介紹了SpringBoot實(shí)現(xiàn)圖片識(shí)別文字的四種方式,包括Tess4J,百度智能云,阿里云,騰訊云這四種,具有一定的參考價(jià)值,感興趣的可以了解一下2024-02-02詳解如何保護(hù)SpringBoot配置文件中的敏感信息
使用過(guò)SpringBoot配置文件的朋友都知道,資源文件中的內(nèi)容通常情況下是明文顯示,安全性就比較低一些,所以為了提高安全性,就需要對(duì)配置文件中的敏感信息進(jìn)行保護(hù),下面就為大家介紹一下實(shí)現(xiàn)方法吧2023-07-07IDEA 2020.1 搜索不到Chinese (Simplified) Language
小編在安裝中文插件時(shí)遇到IDEA 2020.1 搜索不到Chinese ​(Simplified)​ Language Pack EAP,無(wú)法安裝的問(wèn)題,本文給大家分享我的解決方法,感興趣的朋友一起看看吧2020-04-04SpringBoot使用AOP實(shí)現(xiàn)統(tǒng)計(jì)全局接口訪問(wèn)次數(shù)詳解
這篇文章主要介紹了SpringBoot通過(guò)AOP實(shí)現(xiàn)對(duì)全局接口訪問(wèn)次數(shù)的統(tǒng)計(jì),文章從相關(guān)問(wèn)題展開(kāi)全文內(nèi)容詳情,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-06-06Java RocketMQ 路由注冊(cè)與刪除的實(shí)現(xiàn)
這篇文章主要介紹了Java RocketMQ 路由注冊(cè)與刪除的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11如何解決maven搭建一直處于running:..狀態(tài)問(wèn)題
在使用Maven搭建項(xiàng)目時(shí),有時(shí)會(huì)遇到一直處于加載狀態(tài)的情況,通過(guò)修改設(shè)置可以解決這個(gè)問(wèn)題,具體步驟為:1. 打開(kāi)File->Settings->Build, Execution, Deployment->Maven->running,然后在VMOptions中填寫(xiě)"-DarchetypeCatalog=internal"2024-09-09