springboot validator 常用校验注解

常用校验注解

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.Range;

import javax.validation.constraints.*;
import java.util.Date;
import java.util.List;

@Data
@NoArgsConstructor
@AllArgsConstructor
//setter 返回 {@code this} 而不是 {@code void}。
@Accessors(chain = true)
public class TestDto {

    /*** ID*/
    @NotNull(message = "id不能为空")
    private String id;

    @NotBlank(message = "姓名不能为空")
    @Length(min = 1,max = 4, message = "用户名不能超过4个字符")
    @Pattern(regexp = "^[\\u4E00-\\u9FA5A-Za-z0-9\\*]*$", message = "用户昵称限制:最多4个字符,包含文字、字母和数字")
    private String name;


    /** 手机号*/
    @NotBlank(message = "手机号不能为空")
    @Pattern(regexp = "^[1][3,4,5,6,7,8,9][0-9]{9}$", message = "手机号格式有误")
    private String mobile;

    /** 邮箱*/
    @NotBlank(message = "联系邮箱不能为空")
    @Email(message = "邮箱格式不对")
    private String email;

    /*** 创建时间 */
    @Future(message = "时间必须是将来时间")
    private Date createTime;

    // 销售日期(格式:yyyy-MM-dd)
    @Length(max = 20, message = "autoBoughtTime不超过{max}个字符")
    @Pattern(regexp = "^\\d{4}-\\d{2}-\\d{2}$", message = "autoBoughtTime格式必须为yyyy-MM-dd")
    private String autoBoughtTime;

    @Range(min = 60,max = 80,message = "年龄必须要60到80之间,60=<年龄=<80")
    private int age;

    @Pattern(regexp = "^(\\d{18,18}|\\d{15,15}|(\\d{17,17}[x|X]))$", message = "身份证格式错误")
    private String idCard;

    /*** 集合大小检验 */
    @NotNull(message = "list不能为空")
    @Size(min = 1, message = "list大小不可为0")
    private List<String> list;

}

依赖

hibernate-validator和validation-api

<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>6.0.14.Final</version>
    <scope>compile</scope>
</dependency>

<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
    <version>2.0.1.Final</version>
    <scope>compile</scope>
</dependency>

如果已经有了spring-boot-starter-web,就不用再单独引入了
在这里插入图片描述

检验工具类

构建校验器,对参数做检验

import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import java.util.Iterator;
import java.util.Set;

/**
 * 检验工具类
 */
public class ValidatorUtils {

    private ValidatorUtils() { }

    private static Validator validator;
    static {
        validator = Validation.buildDefaultValidatorFactory().getValidator();
    }

    /**
     * 校验对象
     *
     * @param object 待校验对象
     * @param groups 待校验的组
     * @throws RRException 校验不通过,则报RRException异常
     */
    public static void validateEntity(Object object, Class<?>... groups) throws RRException {
        Set<ConstraintViolation<Object>> constraintViolations = validator.validate(object, groups);

        if (!constraintViolations.isEmpty()) {
            Iterator<ConstraintViolation<Object>> iterator = constraintViolations.iterator();
            StringBuilder msg = new StringBuilder();
            while (iterator.hasNext()) {
                ConstraintViolation<Object> constraint = iterator.next();
                msg.append(constraint.getMessage()).append(',');
            }
            throw new RRException(msg.toString().substring(0,msg.toString().lastIndexOf(',')));
        }
    }

}

自定义的异常类

public class RRException extends RuntimeException{
    private String msg;
    private int code = 500;

    public RRException(String msg) {
        super(msg);
        this.msg = msg;
    }

    public RRException(String msg, Throwable e) {
        super(msg, e);
        this.msg = msg;
    }

    public RRException(String msg, int code) {
        super(msg);
        this.msg = msg;
        this.code = code;
    }

    public RRException(String msg, int code, Throwable e) {
        super(msg, e);
        this.msg = msg;
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }
}

单元测试校验

@Test
public void validateTestDto() {
    TestDto dto = new TestDto();
    dto.setId("123");
    dto.setName("张三李四");
    dto.setAge(80);
    dto.setMobile("123");
    dto.setEmail("456");
    dto.setList(new ArrayList<>());
    ValidatorUtils.validateEntity(dto);
}

这里会根据我们的注解顺序做校验,1,不能为空2.字符串长度3.格式是否正确
在这里插入图片描述

Controller控制器

post请求,参数前加上@Valid就会触发校验器校验参数

@PostMapping(value = "/validator")
public Response testValidator(@RequestBody @Valid TestDto testDto){
    return Response.ok();
}

上面例子中使用的Response 以及异常的统一处理可以参考
https://blog.csdn.net/m0_51527921/article/details/125223999

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大佬腿好粗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值