@Valid与@Validated区别

1.@Valid与@Validated作用

@Valid与@Validated都是用来校验接收参数的。

@Valid是使用Hibernate validation的时候使用

@Validated是只用Spring Validator校验机制使用

说明:java的JSR303声明了@Valid这类接口,而Hibernate-validator对其进行了实现。



@Validated与@Valid区别:

@Validated:可以用在类型、方法和方法参数上。但是不能用在成员属性(字段)上,不支持嵌套检测
@Valid:可以用在方法、构造函数、方法参数和成员属性(字段)上,支持嵌套检测\



注意:SpringBoot使用@Valid注解需要引入如下POM

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-validation</artifactId>
</dependency>

2.为什么要用@Valid或@Validated

@Valid与@Validated都是用来校验接收参数的,如果不使用注解校验参数,那么就需要在业务代码中校验,这
样会增加很多的工作量并且代码不优美。
@RestController
@RequestMapping("/valid")
public class ValidControllerTest {

    public static final Logger logger = LoggerFactory.getLogger(ValidControllerTest.class.getName());

    @PostMapping("/login")
    public String doLogin(@RequestBody LoginUser loginUser){
        if(StringUtils.isEmpty(loginUser.getPhone())){
          //抛出异常
          logger.error("伪代码抛出异常---可以用全局异常捕获");
        }
        if(StringUtils.isEmpty(loginUser.getPassWord())){
          //抛出异常
         logger.error("伪代码抛出异常---可以用全局异常捕获");
        }
        return "数据校验通过";
    }
}

如果需要判断多个参数,那就需要写多个if判断,这样会增加编码工作量并且这样写的不优美。

3.使用@Valid或@Validated来做一个简单的案例

如果@Valid|Validated校验不通过,那么错误信息就会封装到BindingResult对象了,可以通过
BindingResult的相关方法获取详细的错误信息并返回给用户。 代码如下:


public class LoginUser {

    @NotBlank(message = "手机号码不能为空")
    private String phone;

    @NotBlank(message = "密码不能为空")
    private String passWord;
}


@RestController
@RequestMapping("/valid")
public class ValidControllerTest {

    public static final Logger logger = LoggerFactory.getLogger(ValidControllerTest.class.getName());

    @PostMapping("/login")
    public String doLogin(@RequestBody @Validated LoginUser loginUser, BindingResult bindingResult){
        if(bindingResult.hasErrors()){
            List<ObjectError> allErrors = bindingResult.getAllErrors();
            allErrors.forEach( v ->{
                logger.error(v.getObjectName()+"======"+v.getDefaultMessage());
            });
        }
        return "数据校验通过";
    }
}


loginUser======密码不能为空
loginUser======手机号码不能为空

4.使用@Valid实现嵌套检测

什么是嵌套检测?

嵌套检测就是在一个beanA中,存在另外一个beanB属性。嵌套检测beanA同时也检测beanB。


public class AgeBean {

    @NotNull(message = "年龄不能为空")
    @Max(value = 120,message = "年龄不能超过120岁")
    @Min(value = 0,message = "年龄不能为负数")
    private int age;
}


public class LoginUser {

    @NotBlank(message = "手机号码不能为空")
    private String phone;
    @NotBlank(message = "密码不能为空")
    private String passWord;
    @NotNull(message = "ageBean不能为null")
    private AgeBean ageBean;
}

注意:LoginUser中ageBean属性没有添加@Valid注解,所以只能检测ageBean属性不为空,但是不能
检测AgeBean对象中age属性定义的最大值和最小值。(@Validated不能添加属性上面,不支持嵌套检测所以
只有使用@Valid)


@RequestMapping("/valid")
public class ValidControllerTest {

    public static final Logger logger = LoggerFactory.getLogger(ValidControllerTest.class.getName());

    @PostMapping("/login")
    public String doLogin(@RequestBody @Validated LoginUser loginUser, BindingResult bindingResult){
        if(bindingResult.hasErrors()){
            List<ObjectError> allErrors = bindingResult.getAllErrors();
            allErrors.forEach( v ->{
                logger.error(v.getObjectName()+"======"+v.getDefaultMessage());
            });
        }
        return "数据校验通过";
    }
}


模拟入参:

{
    "phone":"111",
    "passWord":"",
    "ageBean":{
        "age":-1
    }
}

只抛出密码不为空,没有嵌套检测ageBean属性中的age属性最大值最小值。
loginUser======密码不能为空



添加上@Valid注解,重新测试
public class LoginUser {

    @NotBlank(message = "手机号码不能为空")
    private String phone;
    @NotBlank(message = "密码不能为空")
    private String passWord;
    
    @Valid
    @NotNull(message = "ageBean不能为null")
    private AgeBean ageBean;
}

模拟参数:

{
    "phone":"111",
    "passWord":"",
    "ageBean":{
        "age":-1
    }
}

添加@Valid注解便可以嵌套检测ageBean属性中的age属性的最大值|最小值

loginUser======年龄不能为负数
loginUser======密码不能为空

 5.常用注解说明

@AssertFalse:

所注解的元素必须是Boolean类型,并且值为false

@AssertTrue:

所注解的元素必须是Boolean类型,并且值为true

@DecimalMax:

所注解的元素必须是数字,并且值要小于或等于给定的BigDecimalString值

@DecimalMin:

所注解的元素必须是数字,并且值要小于或等于给定的BigDecimalString值

@Digits:

所注解的元素必须是数字,并且它的值必须有指定的位数

@Email:

所注解的元素要匹配指定的正则表达式

@Max:

所注解的元素必须是数字,并且值要小于或等于给定的值。注意如果@Max所注解的元素是null,则@Max注解
会返回true,所以应该把@Max注解和@NotNull注解结合使用

@Min:

所注解的元素必须是数字,并且值要大于或等于给定的值。注意如果@Min所注解的元素是null,则@Min注解
会返回true,即也会通过校验,所以应该把@Min注解和@NotNull注解结合使用。

@NotBlank:

所注解的元素不能为null且不能为空白,用于校验CharSequence(含String、StringBuilder和StringBuffer)

@NotEmpty:

所注解的元素不能为null且长度大于0,可以是空白,用于校验CharSequence、数组、Collection和Map

@NotNull:

所注解的元素不能为null

@Null:

所注解的元素必须为null

@Pattern:

所注解的元素必须匹配指定的正则表达式。注意如果@Pattern所注解的元素是null,则@Pattern注解会返回
true,即也会通过校验,所以应该把@Pattern注解和@NotNull注解结合使用

@Size:

所注解的元素必须符合指定的大小,该注解可用于数组,CharSequence(含String、StringBuilder和
StringBuffer),Collection和Map。注意如果@Size所注解的元素是null,则@Size注解会返回true,即也
会通过校验,所以应该把@Size注解和@NotNull注解结合使用

 

### 回答1: @valid@validated区别在于: @valid是一个注解,用于标记一个方法或参数是否有效。它通常用于验证输入参数的有效性,例如检查参数是否为空或是否符合特定的格式要求。 @validated是一个Spring框架中的注解,用于标记一个方法或参数是否已经通过验证。它通常用于在控制器层面验证输入参数的有效性,例如检查参数是否为空或是否符合特定的格式要求,并在验证失败时返回错误信息。 ### 回答2: @valid@validated都是Spring框架中用于校验数据的注解。它们的主要区别如下: 1. 作用范围不同:@valid注解通常用于校验方法参数,可以标记在方法的参数或参数类型上,用于校验请求参数的有效性。而@validated注解一般用于校验方法、类或接口上,用于校验方法的返回值或类的字段的有效性。 2. 使用校验器不同:@valid注解使用Java的Bean Validation 标准的校验器(如Hibernate Validator)进行数据校验,用于校验数据对象的属性是否合法。而@validated注解使用Spring框架内置的校验器(如SpringValidator)进行数据校验,用于校验Spring Bean对象。 3. 错误处理方式不同:当校验失败时,@valid注解会抛出MethodArgumentNotValidException或ConstraintViolationException异常,你需要自己处理这些异常并返回错误信息给用户。而@validated注解会自动将校验失败的信息封装到BindingResult对象中,你可以通过该对象获取校验失败的详细信息。 4. 异常转换不同:Spring框架对于@valid注解处理的异常会自动转换为HTTP状态码为400的错误响应,适用于RESTful风格的接口。而对于@validated注解,Spring框架不会进行自动的异常转换,你需要在代码中手动处理异常并返回错误信息。 总的来说,@valid注解主要用于方法参数的校验,并使用Java标准的校验器,适用于校验请求参数。而@validated注解主要用于方法、类或接口的校验,并使用Spring框架内置的校验器,适用于校验Spring Bean对象。 ### 回答3: @valid@validated都是Java Spring框架中的注解,用于验证方法参数的合法性。它们的区别主要在于适用的场景验证方式。 @valid注解通常用于基于Java Bean Validation规范的验证。这意味着当添加了@valid注解的方法参数时,会自动触发Java Bean Validation规范中定义的验证规则。例如,可以对参数应用注解如@NotBlank、@NotNull、@Min等,以验证参数的非空、最小值等条件。使用@valid注解能够方便地进行基于注解的验证。 @validated注解则是Spring框架提供的注解,主要用于验证自定义的验证规则。相比于@valid注解,@validated注解更加灵活,可用于各种自定义验证方法。@validated注解可以其他验证注解一起使用,例如@NotNull、@Min、@Size等,来创建自定义的参数验证规则。通过使用@validated注解,可以根据自己的业务需求来编写验证逻辑。 总结来说,@valid注解适用于基于Java Bean Validation规范的验证,而@validated注解则适用于基于Spring框架的自定义验证规则。根据需求情况选择合适的注解,能够提高代码的可读性可维护性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值