Spring表单验证注解(学习笔记)

文章详细介绍了SpringBoot中使用@Valid和@Validated进行表单验证的方法,包括实体类上的验证、接口上的验证以及异常处理。@Valid用于基础验证,支持在成员属性上,能进行嵌套验证。@Validated则提供了分组验证功能,但不能用于成员属性。同时,文章给出了代码示例,展示了如何在不同场景下使用这两个注解进行参数效验。
摘要由CSDN通过智能技术生成

springboot表单验证

@Valid

用处:对前端传过来的参数进行验证,若不符合规范,可以禁止后续操作,且显示规范中的异常信息。

@Valid 的主要作用是用于数据效验,可以在定义的实体中的属性上,添加不同的注解来完成不同的校验规则

区别:

分组:无分组功能

可注解位置:可以用在方法、构造函数、方法参数和成员属性上(两者是否能用于成员属性上直接影响能否提供嵌套验证的功能)

嵌套验证:用在方法入参上无法单独提供嵌套验证功能;能够用在成员属性上,提示验证框架进行嵌套验证;能配合嵌套验证注解@Valid进行嵌套验证。

实现逻辑:

在这里插入图片描述

代码实现(三种情况):
实体类上加验证;
1:
public class User{
    @NotBlank(message = "姓名不能为空")
    private String name;
    @NotBlank(message = "密码不能为空")
    private String password;
}

2:若实体类嵌套另一个实体类时要加@Valid
public class User{
    @NotBlank(message = "姓名不能为空")
    private String name;
    @Valid
    @NotNull(message = "用户信息不能为空")
    private UserInfo userInfo;
}
public class UserInfo{
    @NotBlank(message = "年龄不能为空")
    @Max(value = 18, message = "不能超过18岁")
    private String age;
    @NotBlank(message = "性别不能为空")
    private String gender;
}
接口上加验证:

在 Controller 类中添加接口,POST 方法中接收设置了 @Valid 相关注解的实体对象,然后在参数中添加 @Valid 注解来开启效验功能,需要注意的是, @Valid 对 Get 请求中接收的平面参数请求无效,稍微略显遗憾。

@RestController
public class TestController{
    @PostMapping("/user")
    public String addUserInfo(@Valid @RequestBody User user){
        return "成功";
    }
}
异常类上加验证:

写一个全局异常处理类,然后对接口中抛出的异常进行处理,而 @Valid 配合 Spring 会抛出 MethodArgumentNotValidException 异常,这里我们需要对该异常进行处理即可

@RestControllerAdvice("com.hhz.valid") //指定异常处理包名
public class GlobalExceptionHandler{
    
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ExceptionHandler({MethodArgumentNotValidException.class})
    public String paramExceptionHandler(MethodArgumentNotValidException e){
        BindingResult exceptions = e.getBindingResult();
        // 判断异常中是否有错误信息,如果存在就使用异常中的消息,否则使用默认消息
		if(exceptions.hasErrors()){
            List<ObjectError> errors = exceptions.getAllErrors();
            if(!errors.isEmpty()){
                FieldError fieldError = (FieldError)errors.get(0);
                return fieldError.getDefaultMessage();
            }
        }
        return "请求参数有误";
    }
}
常用的注解:

@Null

@NotBlank(message=“不能为空哦”)

@Min(value=18,message=“不能小于18岁啊”)

在这里插入图片描述

@Validated

区别:

分组:提供分组功能,可在入参验证时,根据不同的分组采用不同的验证机制。

可注解位置 :可以用在类型、方法和方法参数上。但是不能用在成员属性上

嵌套验证:用在方法入参上无法单独提供嵌套验证功能;不能用在成员属性上;也无法提供框架进行嵌套验证;能配合嵌套验证注解 @Valid 进行嵌套验证。

代码实现(主要区别是分组方式):
@Entity
public class User{
    @NotNull(group=Update.class,message="不能为空")
    @Null(group=Add.class)
    private String userId;
    private String name;
}

@RestController("/user")
public class UserController{
 
    @Autowired
    private UserService userSerivce;
    
    @PutMapping
    //@Validated(value={User.Update.class})该接口使用update的校验方式
    public String updateUser(@Validated(value={User.Update.class}) @RequestBody User user){
        int res = userService.updateUser(user);
        return res == 1 ? "成功" : "失败";
    }
    
    @PostMapping
    public String addUser(@Validated(value={User.Add.class}) @RequestBody User user){
        int res = userService.insertUser(user);
        return res == 1 ? "成功" : "失败";
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值