java、springboot的@Validated、@Valid注解使用与区别

使用步骤

单个实体类可只需添加好相应注解

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注解没有对配置类和配置文件绑定属性进行校验的功能

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值