溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

springmvc中@valid與@validated的區(qū)別是什么

發(fā)布時間:2021-08-06 15:00:11 來源:億速云 閱讀:245 作者:Leah 欄目:編程語言

這篇文章將為大家詳細(xì)講解有關(guān)springmvc中@valid與@validated的區(qū)別是什么,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。

1.分組校驗(yàn)

@Validated提供了一個分組功能,可以在入?yún)Ⅱ?yàn)證時,根據(jù)不同的分組采用不同的驗(yàn)證機(jī)制。沒有添加分組屬性時,默認(rèn)驗(yàn)證沒有分組的驗(yàn)證屬性。

使用場景舉例:一個DTO類,有一個id的屬性,我們希望在insert的時候id為空,在update和delete的時候,id不能為空。

本篇內(nèi)容是在( springmvc整合validation(一) )的基礎(chǔ)上實(shí)現(xiàn),具體實(shí)現(xiàn)如下:

1.1新增groups

我們首先新增insert、update、delete三個group。注意,group必須為接口。

package com.hjj.demo.validate;public interface ValidateGroups {public interface InsertGroup{

    }public interface UpdateGroup{

    }public interface DeleteGroup{

    }
}

1.2使用group

在ValidateTestDTO類的id屬性上使用group。

@NotNull(groups = {ValidateGroups.UpdateGroup.class,ValidateGroups.DeleteGroup.class})@Null(groups = {ValidateGroups.InsertGroup.class})public Long id;

期望達(dá)到的目前,在update和delete的時候id不能為空,在insert的時候id必須為空。

1.3修改controller代碼

package com.hjj.demo.validate;import org.springframework.http.MediaType;import org.springframework.validation.annotation.Validated;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.RestController;import javax.validation.Valid;@RestControllerpublic class ValidateTestController{@PostMapping( value = "/insertTest",produces= MediaType.APPLICATION_JSON_VALUE)public String insert(@RequestBody @Validated(ValidateGroups.InsertGroup.class) ValidateTestDTO validateTestDTO){return "insert OK";    }@PostMapping( value = "/updateTest",produces= MediaType.APPLICATION_JSON_VALUE)public String update(@RequestBody @Validated(ValidateGroups.UpdateGroup.class) ValidateTestDTO validateTestDTO){return "update OK";    }@PostMapping( value = "/deleteTest",produces= MediaType.APPLICATION_JSON_VALUE)public String delete(@RequestBody @Validated(ValidateGroups.DeleteGroup.class) ValidateTestDTO validateTestDTO){return "delete OK";    }@PostMapping( value = "/test",produces= MediaType.APPLICATION_JSON_VALUE)public String test(@RequestBody @Valid ValidateTestDTO validateTestDTO){return "test OK";    }
}

如上代碼所示,我們新增3個接口,分別模擬insert、update、delete的場景。這里有一個地方要注意,分組校驗(yàn)只有@validated注解才支持,所以我們使用@validated注解,并且注解里面加上期望校驗(yàn)的group。

1.4測試

insert場景:

springmvc中@valid與@validated的區(qū)別是什么

update場景:

springmvc中@valid與@validated的區(qū)別是什么

delete場景:

springmvc中@valid與@validated的區(qū)別是什么

從以上的3個測試用例可以看出,滿足我們的校驗(yàn)需求。

2.注解使用的地方

@Validated:可以用在類型、方法和方法參數(shù)上。但是不能用在成員屬性(字段)上

@Valid:可以用在方法、構(gòu)造函數(shù)、方法參數(shù)和成員屬性(字段)上

兩者是否能用于成員屬性(字段)上直接影響能否提供嵌套驗(yàn)證的功能。

3.嵌套校驗(yàn)

在上一篇中,我們已經(jīng)介紹了@valid注解的嵌套校驗(yàn)。那么問題來了,@validated不支持用在成員變量上面,怎么實(shí)現(xiàn)嵌套校驗(yàn)?zāi)兀?/p>

其實(shí)很簡單,成員變量上面還是使用@valid注解,但是在controller上面我們使用@validated注解,這樣就即支持分組校驗(yàn),也支持嵌套校驗(yàn)了。

測試代碼如下

ValidateTestDTO中增加以下代碼:

@NotNull@Valid //這里還是使用valid注解public ValidateLevel2DTO dto;public ValidateLevel2DTO getDto() {return dto;}public void setDto(ValidateLevel2DTO dto) {this.dto = dto;}

修改controller代碼,使用@validated注解:

@PostMapping( value = "/test",produces= MediaType.APPLICATION_JSON_VALUE)public String test(@RequestBody @Validated ValidateTestDTO validateTestDTO){return "test OK";}

測試:

springmvc中@valid與@validated的區(qū)別是什么

從測試結(jié)果可以看出,嵌套校驗(yàn)正常工作。

4.總結(jié)

最后,我們總結(jié)一下。

1)@validated支持分組校驗(yàn),@valid不支持

2)@validated和@valid使用的地方不一樣

3)@Validated:用在方法入?yún)⑸?strong>無法單獨(dú)提供嵌套驗(yàn)證功能。不能用在成員屬性(字段)上。能配合嵌套驗(yàn)證注解@Valid進(jìn)行嵌套驗(yàn)證。

@Valid:用在方法入?yún)⑸?strong>無法單獨(dú)提供嵌套驗(yàn)證功能。夠用在成員屬性(字段)上。能配合嵌套驗(yàn)證注解@Valid進(jìn)行嵌套驗(yàn)證。

關(guān)于springmvc中@valid與@validated的區(qū)別是什么就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI