这篇文章将为大家详细讲解有关springmvc中@valid与@validated的区别是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
@Validated提供了一个分组功能,可以在入参验证时,根据不同的分组采用不同的验证机制。没有添加分组属性时,默认验证没有分组的验证属性。
使用场景举例:一个DTO类,有一个id的属性,我们希望在insert的时候id为空,在update和delete的时候,id不能为空。
本篇内容是在( springmvc整合validation(一) )的基础上实现,具体实现如下:
我们首先新增insert、update、delete三个group。注意,group必须为接口。
package com.hjj.demo.validate;public interface ValidateGroups {public interface InsertGroup{ }public interface UpdateGroup{ }public interface DeleteGroup{ } }
在ValidateTestDTO类的id属性上使用group。
@NotNull(groups = {ValidateGroups.UpdateGroup.class,ValidateGroups.DeleteGroup.class})@Null(groups = {ValidateGroups.InsertGroup.class})public Long id;
期望达到的目前,在update和delete的时候id不能为空,在insert的时候id必须为空。
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的场景。这里有一个地方要注意,分组校验只有@validated注解才支持,所以我们使用@validated注解,并且注解里面加上期望校验的group。
insert场景:
update场景:
delete场景:
从以上的3个测试用例可以看出,满足我们的校验需求。
@Validated:可以用在类型、方法和方法参数上。但是不能用在成员属性(字段)上
@Valid:可以用在方法、构造函数、方法参数和成员属性(字段)上
两者是否能用于成员属性(字段)上直接影响能否提供嵌套验证的功能。
在上一篇中,我们已经介绍了@valid注解的嵌套校验。那么问题来了,@validated不支持用在成员变量上面,怎么实现嵌套校验呢?
其实很简单,成员变量上面还是使用@valid注解,但是在controller上面我们使用@validated注解,这样就即支持分组校验,也支持嵌套校验了。
测试代码如下
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";}
测试:
从测试结果可以看出,嵌套校验正常工作。
最后,我们总结一下。
1)@validated支持分组校验,@valid不支持
2)@validated和@valid使用的地方不一样
3)@Validated:用在方法入参上无法单独提供嵌套验证功能。不能用在成员属性(字段)上。能配合嵌套验证注解@Valid进行嵌套验证。
@Valid:用在方法入参上无法单独提供嵌套验证功能。能够用在成员属性(字段)上。能配合嵌套验证注解@Valid进行嵌套验证。
关于springmvc中@valid与@validated的区别是什么就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。