@Valid使用

本文对比了`@Valid`和`@Validated`在Spring框架中的角色,讲解了它们的依赖引入、在实体类中添加验证规则的方法,以及如何在控制器中通过`@RequestBody`配合`BindingResult`进行局部验证和全局异常处理。重点介绍了`@Validated`的分组验证扩展功能。

一、区分@Valid和@Validated

  • @Valid属于javax.validation.Valid
  • @Validaated属于javax.validation
  • @Validated是spring对@Valid做的二次封装,扩展了分组验证的规则

二、@Valid的使用

  • pom依赖
		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>
  • 实体类添加规则,规则可自行百度
  • controller传参数添加验证,验证方法有两种
  • 1.每次传参进行验证
@PostMapping("add-user")
    public ResultVo addUser (@RequestBody @Valid UserDto userDto, BindingResult bindingResult){
        if (bindingResult.hasErrors()){
            return new ResultVo("A0001", bindingResult.getAllErrors().get(0).getDefaultMessage());
        }
        return userService.insertUser(userDto);
    }

添加BindingResult

  • 2.全局异常捕获,配合日志进行记录,不需要每次进行验证(推荐)
@Slf4j
@ControllerAdvice
public class GlobalExceptionHandler {

    private final static String EXCEPTION_MSG_KEY = "Exception message : ";

    @ResponseBody
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResultVo handleValidException(MethodArgumentNotValidException e){
        //日志记录错误信息
        log.error(Objects.requireNonNull(e.getBindingResult().getFieldError()).getDefaultMessage());
        //将错误信息返回给前台
        return new ResultVo("A0001", Objects.requireNonNull(e.getBindingResult().getFieldError()).getDefaultMessage());
    }
}
### @Valid 注解使用教程 #### Maven 依赖引入 为了在项目中使用 `@Valid` 注解,需先引入相应的依赖。对于 Spring Boot 应用程序来说,可以通过添加如下 Maven 配置来完成: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency> ``` 此操作会自动导入必要的 Bean Validation API 和 Hibernate Validator 实现[^1]。 #### 控制器层中的应用实例 当处理 HTTP 请求时,在控制器的方法参数上使用 `@Valid` 可以触发对传入对象字段的有效性检查。如果验证失败,则抛出异常并返回错误响应给客户端。下面是一个具体的例子展示如何在一个 RESTful Web Service 的 POST 方法里运用该注解来进行请求体校验: ```java @RestController public class UserController { @PostMapping("/users") public ResponseEntity<String> createUser(@Valid @RequestBody UserRequest userRequest) { // 处理业务逻辑... return ResponseEntity.ok("User created successfully"); } } ``` 此处假设 `UserRequest` 类定义了一些带有约束条件的属性,比如用户名长度限制等[^2]。 #### 内部类特殊情形下的注意事项 值得注意的是,在某些情况下(例如存在嵌套的对象结构),可能需要额外标注父级容器上的成员变量为 `@Valid` 才能确保子元素也能被正确检验。具体可参见以下代码片段说明这一现象的发生场景及其解决方案[^3]: ```java @Data public static class ParentClass { @Valid // 此处标记非常重要!它使得内含列表里的每一个Item都能接受到完整的验证流程。 private List<Item> items; } @Data public static class Item { @NotNull(message = "ID cannot be null.") private Long id; @Size(min=5, max=20, message="Name must between 5 and 20 characters long.") private String name; } ``` 通过上述设置之后,即使是在复杂的数据模型下也能够有效地执行全面而细致化的输入合法性判断工作了。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值