关于数据校验Bean Validation的学习

1,导相关依赖

2,常用的Validation注解

@NotNull: 标记字段不能为 null

@NotEmpty: 标记集合字段不为空(至少要有一个元素)

@NotBlank: 标记字段串字段不能是空字符串(即它必须至少有一个字符)

@Min / @Max: 标记数字类型字段必须大于/小于指定的值

@Pattern: 标记字符串字段必须匹配指定的正则表达式

@Email: 标记字符串字段必须是有效的电子邮件地址

还有很多,暂不列举。

3,在实体类中配置,例如:

复制代码
package com.itcast.ucenter.entity
import
javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import javax.validation.constraints.Pattern; /** * <p> * 用户信息表 * </p> * * @author StarRiver * @since 2022-11-15 */ @Data public class User{
  //标记接口,新增组   public interface Add{

  }

private static final long serialVersionUID = 1L; private Long userId; private String nickName; @NotNull(message = "手机号不能为空") @Pattern(regexp = "^[0-9]+$", message = "手机号码只能为数字") @Pattern(regexp = "^1[34578]\\d{9}$" , message = "手机号码格式有误") private String phonenumber; @NotNull(groups={Add.class},message = "密码不能为空")
private String password; }
复制代码

4,在方法上校验,例如:

 @PostMapping("register")
    public R registerUser(@Valid RegisterVo registerVo) {
        userService.register(registerVo);
        return R.ok();
    }
@Valid注解的作用:是启动自动验证
@Validated注解的作用,自动按组进行校验,1比如:
 @PostMapping("register")
    public R registerUser(@Validated({Add.class}) RegisterVo registerVo) {
        userService.register(registerVo);
        return R.ok();
    }
2,如果使用了这种
复制代码
    @PostMapping("login")
    public R loginUser(@NotNull(message = "手机号不能为空")
                       @Pattern(regexp = "^[0-9]+$", message = "手机号码只能为数字")
                       @Pattern(regexp = "^1[34578]\\d{9}$" , message = "手机号码格式有误")
                       @RequestParam String phonenumber,
                       @NotNull(message = "密码不能为空")
                       @RequestParam String password) {
        //调用service方法实现登录
        //返回token值,使用jwt生成
        String token = userService.login(phonenumber,password);
        return R.ok().data("token", token);
    }
复制代码
那么要在类上面加上 @Validated注解,才可以使得参数的校验生效

5,统一异常返回类
复制代码
package com.itcast.servicebase.exceptionhandler;

import com.itcast.commonutil.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindException;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

@ControllerAdvice
@ResponseBody
public class GlobalExceptionHandler {

    /**
     * @param e
     * @return
     * @Validated写在方法上会报这个异常数据校验异常返回
     */
    @ExceptionHandler(value = BindException.class)
    public R BindEx(BindException e) {
        List<FieldError> fieldErrors = e.getFieldErrors();
        StringBuilder sb = new StringBuilder();
        for (FieldError fe : fieldErrors) {
            sb.append("属性:")
                    .append(fe.getField())
                    .append("校验不通过,原因:")
                    .append(fe.getDefaultMessage())
                    .append(";");
        }
        return R.error().data("message", sb.toString());
    }

    //@Validated写在类上会报这个异常数据校验异常返回
    @ExceptionHandler(value = ConstraintViolationException.class)
    public R BindHandlerEx(ConstraintViolationException e) {
        Set<ConstraintViolation<?>> set = e.getConstraintViolations();
        List<String> list = set.stream().map(v ->
                        "属性:" + v.getPropertyPath()
                                + ",属性的值:" + v.getInvalidValue()
                                + ",校验不通过的提示信息:" + v.getMessage()
                                + ",消息模板:" + v.getMessageTemplate())
                .collect(Collectors.toList());
        return R.error().data("list", list);
    }

    //自定义异常
    @ExceptionHandler(ShopException.class)
    public R error(ShopException e) {
        e.printStackTrace();
        return R.error().code(e.getCode()).message(e.getMsg());
    }
}
复制代码

 

6,待学习。

 

posted @   不爱学习的摆烂王  阅读(48)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示