使用步骤
单个实体类可只需添加好相应注解
public class User{ @NotBlank(message = "姓名不为空") private String username; @NotBlank(message = "密码不为空") private String password; }
嵌套实体对象,则需要在最外层属性上添加@Valid注解
public class User{ @NotBlank(message = "姓名不为空") private String username; @NotBlank(message = "密码不为空") private String password; //嵌套必须加@Valid,否则嵌套中的验证不生效 @Valid @NotNull(message = "用户信息不能为空") private UserInfo userInfo; }
定义在contorller上
@RestController @Validated @RequestMapping("/") public class ChangeBindController { @ResponseBody @RequestMapping(value ="/changeAXB", method = RequestMethod.POST) @Validated(OnUpdate.class) public Result<Object> changeBinding(@Valid @RequestBody ChangeDTO changeDTO) { ... return new Result; } } //------------------------- public String saveProj(@Valid @RequestBody CProject project,BindingResult results) //------------------------- @ResponseBody @RequestMapping(value ="/changeAXB", method = RequestMethod.POST) public Result<Object> changeBinding1(@Validated @RequestBody ChangeDTO changeDTO)
[可选]controller类中的方法上添加上@Valid的注解(我们还可以给bean后紧跟一个BindingResult,可以获取到校验的结果信息)
定义在service上
@service public class test{ public void do(@Valid ChangeDTO changeDTO) { } public void do(@Validated String password) { } }
@Validated用法和@Valid相同,因为本来就是对@Valid注解的封装,对于异常的抛出处理,也和上面一致
@Valid 、@Validated
进行验证的时候,我们需要用一个对象去接收校验结果,最后根据校验结果判断,从而提示用户。需要配合BindingResult results 一起使用,如果不用BindingResult直接Exception
public Object getUser(@Valid @RequestBody User user, BindingResult result)
如果不加BindingResult result,系统会自动抛出MethodArgumentNotValidException异常
如果加了BindingResult result,手动处理终端,否则直接通过
验证不通过,会自动拦截,系统抛出exption错误
@Valid 和 @Validated 两个注解进行总结下:
(1)@Valid 和 @Validated 两者都可以对数据进行校验,待校验字段上打的规则注解(@NotNull, @NotEmpty等)都可以对 @Valid 和 @Validated 生效;
(2)进行校验的时候,需要用 BindingResult 来做一个校验结果接收。当校验不通过的时候,如果手动不 return ,则并不会阻止程序的执行,方法使用的时候需要注意,一旦用了BindingResult来封装校验结果,那么就不会再抛出MethodArgumentNotValidException异常了;
(3) 进行校验的时候,,不使用BindingResult ,当校验不通过的时候,程序会抛出400异常,阻止方法中的代码执行,这时需要再写一个全局校验异常捕获处理类,然后返回校验提示。
(4)总体来说,@Validated 使用起来要比 @Valid 方便一些,它可以帮我们节省一定的代码,并且使得方法看上去更加的简洁。
重要区别
@Validated注解和@Valid注解区别
import org.springframework.validation.annotation.Validated; import javax.validation.Valid;
@Validated是spring旗下的注解,
@Valid注解时javax包下的注解,是jdk给提供的
@Validated:是spring提供的对@Valid的封装
,常见用在方法上进行校验,@Validated要比@Valid更加强大,@Validated在@Valid之上提供了分组功能和验证排序功能
@Valid
是使用Hibernate validation
的时候使用
@Validated
是只用Spring Validator
校验机制使用@Validation
对
@Valid`进行了二次封装,在使用上并没有区别,但在分组、注解位置、嵌套验证等功能上有所不同,这里主要就这几种情况进行说明。@Validated:可以用在类型、方法和方法参数上。但是不能用在成员属性(字段)上,不支持嵌套检测
@Valid:可以用在方法、构造函数、方法参数和成员属性(字段)上,支持嵌套检测
注意:SpringBoot使用@Valid注解需要引入如下POM (springboot 默认已经包含,理论不需要到这一步)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
@Validated可对配置类yaml->config进行校验,
@Valid注解没有对配置类和配置文件绑定属性进行校验的功能