解決@Validated注解無效,嵌套對象屬性的@NotBlank無效問題
@Validated注解無效,嵌套對象屬性的@NotBlank無效
最近在做的公司項(xiàng)目是一個(gè)表單系統(tǒng),剛好要用到@Validated注解來對表單字段進(jìn)行驗(yàn)證。第一次使用遇到了一些坑,問了同事之后,總算是掌握了。
步驟
首先,在dto實(shí)體你想要做驗(yàn)證的屬性前,加上@NotBlank/NotNull/NotEmpty注解:

他們的區(qū)別如下:
@NotBlank:只用在String上,表示傳進(jìn)來的值不能為null,而且調(diào)用trim()后,長度必須大于0@NotNull:不能為null,但可以為empty(分配了內(nèi)存空間,但值為空)@NotEmpty:不能為null,而且長度必須大于0
然后在service層接口前添加注解@Validated

然后運(yùn)行,給屬性傳遞空值,發(fā)現(xiàn)沒有任何反應(yīng);是因?yàn)闆]在接口方法的參數(shù)前加上@Valid注解,如下所示:

加上后再運(yùn)行,傳遞空值,成功報(bào)錯(cuò)。 (同時(shí),以上總結(jié)可以加在controller層進(jìn)行驗(yàn)證,@valid同樣加在方法參數(shù)前,@validated加在controller類名前圖

同樣能起效果)
內(nèi)層對象無法驗(yàn)證
做到后面發(fā)現(xiàn)傳遞的對象里面還有一個(gè)對象,要對里面的對象進(jìn)行驗(yàn)證,這時(shí)候是驗(yàn)證不到的


需要在里面對象前也加上總結(jié)@valid,這樣,無論嵌套多少,都可以驗(yàn)證

(對于對象泛型,也能驗(yàn)證成功)
@Validated注解不生效問題、如何使用
1、需要引入的包
(缺少其中一個(gè)包,項(xiàng)目會(huì)報(bào)錯(cuò),或者validate注解不生效)
- hibernate-validator-6.0.14.Final.jar
- jboss-logging-3.3.2.Final.jar
- validation-api-2.0.1.Final.jar
- classmate-1.4.0.jar
2、將@Validated打在controller中需要驗(yàn)證的實(shí)體類前面
@PostMapping("/add")
@ResponseBody
public AjaxResult addSave(@Validated SysDept dept){
}
3、在具體實(shí)體類中定義字段的驗(yàn)證規(guī)則
(這里注解可以放在字段上,或者是get方法上,放在set方法上,會(huì)報(bào)錯(cuò))
private String deptName;
@NotBlank(message = "部門名稱不能為空")
@Size(min = 0, max = 30, message = "部門名稱長度不能超過30個(gè)字符")
public String getDeptName(){
return deptName;
}
4、數(shù)據(jù)格式校驗(yàn)
對其錯(cuò)誤進(jìn)行處理(全局異常處理),不進(jìn)行處理,會(huì)直接報(bào)400錯(cuò)誤
@ControllerAdvice
可以實(shí)現(xiàn)三個(gè)方面的功能:
- 全局異常處理
- 全局?jǐn)?shù)據(jù)綁定
- 全局?jǐn)?shù)據(jù)預(yù)處理
@RestControllerAdvice
public class GlobalExceptionHandler{
@ExceptionHandler(BindException.class)
public ApiResult validatedBindException(BindException e){
log.error(e.getMessage(), e);
String message = e.getAllErrors().get(0).getDefaultMessage();
return ApiResult .error(message);
}
}
在controller中的方法中進(jìn)行單個(gè)參數(shù)校驗(yàn)注意事項(xiàng)
1、controller類上打上注解@Validated
2、方法參數(shù)上給出格式如:
public Result method(@NotNull @RequestParam("id") Long id) {
3、其中@RequestParam("id")必須加,否則驗(yàn)證無效
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Spring通過<import>標(biāo)簽導(dǎo)入外部配置文件
之前文章里我們講到Spring加載Xml配置文件的細(xì)節(jié),那么加載完了我們肯定要解析這個(gè)配置文件中定義的元素。這篇我們首先來分析下Spring是如何通過標(biāo)簽導(dǎo)入外部配置文件的。2021-06-06
解決HttpPost+json請求---服務(wù)器中文亂碼及其他問題
這篇文章主要介紹了解決HttpPost+json請求---服務(wù)器中文亂碼及其他問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01
SpringBoot之如何搭建SpringBoot+Maven項(xiàng)目
這篇文章主要介紹了SpringBoot之如何搭建SpringBoot+Maven項(xiàng)目問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07
配置java環(huán)境變量(linux mac windows7)
本文給大家詳細(xì)總結(jié)介紹了Linux、MAC以及Windows下配置java環(huán)境變量的方法,非常的細(xì)致全面,有需要的小伙伴可以參考下2015-11-11
Java通過反射獲取方法參數(shù)名的方式小結(jié)
這篇文章主要為大家詳細(xì)介紹了Java如何通過反射獲取方法參數(shù)名的方式,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-02-02
SpringBoot自定義路由覆蓋實(shí)現(xiàn)流程詳解
這篇文章主要介紹了SpringBoot自定義路由覆蓋實(shí)現(xiàn)流程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-01-01
簡潔實(shí)用的Java Base64編碼加密異常處理類代碼
這篇文章主要介紹了簡潔實(shí)用的Java Base64編碼加密異常處理類代碼,有一定的實(shí)用價(jià)值,需要的朋友可以參考下2014-07-07

