spring boot --- validator

本文介绍SpringBoot中Validator框架的应用,包括常用注解如@NotNull、@Min等,并演示了基本验证及自定义验证的实现过程。

spring boot — validator框架

几种常用的注解

注解功能
@Null被注释的元素必须为 null
@NotNull被注释的元素必须不为 null
@AssertTrue被注释的元素必须为 true
@AssertFalse被注释的元素必须为 false
@Min(value)被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value)被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMin(value)被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@DecimalMax(value)被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@Size(max=, min=)被注释的元素的大小必须在指定的范围内
@Digits (integer, fraction)注释的元素必须是一个数字,其值必须在可接受的范围内
@Past被注释的元素必须是一个过去的日期
@Future被注释的元素必须是一个将来的日期
@Pattern(regex=,flag=)被注释的元素必须符合指定的正则表达式
注解(Hibernate附加的 Validator)功能
@NotBlank(message =)验证字符串非null,且长度必须大于0
@Email被注释的元素必须是电子邮箱地址
@Length(min=,max=)被注释的字符串的大小必须在指定的范围内
@NotEmpty被注释的字符串的必须非空
@Range(min=,max=,message=)被注释的元素必须在合适的范围内

一、基本验证

  • 代码1
/*新建一个加验证的实体类用*/
import org.hibernate.validator.constraints.NotBlank;
import javax.validation.constraints.AssertFalse;
import javax.validation.constraints.Pattern;

public class DemoModel {

    @NotBlank(message="用户名不能为空")
    private String name;

    @NotNull(message="生日不能为空")
    @Pattern(regexp="^[0-9]{4}-[0-9]{2}-[0-9]{2}$",message="出生日期格式不正确")
    private String birthday;

    @Max(value=10,message="最大值不能大于10")
    private String maxValue;

    @Min(value=5,message="最小值不能小于5")
    private String minValue;

    @NotBlank
    @Length(max = 4,min = 2,message = "长度应该在2-4之间")
    private String lengthValue;

    ...省略geter/setter
}
  • 代码2
/*Controller*/
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.Valid;
import java.util.Date;
import java.util.List;

@RestController
@RequestMapping("valBean/")
public class ValidateBeanController {

@RequestMapping("demo")
public void demo2(@Valid DemoModel demo, BindingResult result){
    System.out.println("**********开始demo2**********" + new Date());
    //如果验证通不过的处理
    if(result.hasErrors())
    {
        List<FieldError> fieldErrors=result.getFieldErrors();
        for (FieldError error : fieldErrors)
        {
            //打印错误
            System.out.println("字段名:"+error.getField()+",值:"+error.getRejectedValue()+",异常信息:"+error.getDefaultMessage());
        }
    }
    System.out.println("**********结束demo2**********" + new Date());
}
测试链接:http://localhost:8080/test/valBean/demo?name=&birthday=&maxValue=1
控制台输出:
**********开始demo2**********Mon Feb 05 17:47:38 CST 2018
字段名:minValue,值:null,异常信息:不能为null
字段名:birthday,值:,异常信息:出生日期格式不正确
字段名:lengthValue,值:null,异常信息:不能为空
字段名:name,值:,异常信息:用户名不能为空
字段名:maxValue,值:11,异常信息:最大值不能大于10
**********结束demo2**********Mon Feb 05 17:47:38 CST 2018

二、自定义验证

  • 代码3

新建一个annotation接口类

import aaa.annotation.validator.MoneyValidator;
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = MoneyValidator.class ) //对应代码4的实现类
public @interface Money {

    String message() default "金额应为非负数,最多保留小数点后两位!";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}

  • 代码4

新建一个接口实现类

/*
 * Moblie对应代码3的接口类
 * RegexpUtil.MOBILE_REGEXP 正则表达式
 * 也可以不用正则,用代码进行判断,返回结果是boolean即可
 */
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class MoblieValidator implements ConstraintValidator<Moblie,Object> 
{

    @Override
    public void initialize(Moblie moblie) {
    }

    @Override
    public boolean isValid(Object value, ConstraintValidatorContext constraintValidatorContext) {
        if (!RegexpUtil.isValidate((String)value, RegexpUtil.MOBILE_REGEXP)) {
            return false;
        }
        return true;
    }
}
控制台输出:
**********开始demo2**********Tue Feb 06 09:37:48 CST 2018
字段名:money,值:null,异常信息:金额应为非负数,最多保留小数点后两位!
字段名:lengthValue,值:null,异常信息:不能为空
字段名:birthday,值:888,异常信息:出生日期格式不正确
字段名:minValue,值:null,异常信息:不能为null
字段名:name,值:,异常信息:用户名不能为空
**********结束demo2**********Tue Feb 06 09:37:48 CST 2018


注意:测试时需要通过hppt请求,不能直接通过测试类调用。
在 Gradle 项目中引入 `spring-boot-starter-validation` 依赖的步骤如下: --- ### **1. 基础配置(Spring Boot 2.x/3.x)** 在 `build.gradle` 的 `dependencies` 块中添加: ```gradle dependencies { // 其他依赖... implementation 'org.springframework.boot:spring-boot-starter-validation' } ``` --- ### **2. 版本管理(可选)** 如果需要对版本显式控制(如与其他库兼容),可通过 `ext` 或 `dependencyManagement` 指定: #### 方式一:全局版本定义 ```gradle ext { springBootVersion = '3.1.0' // 或 '2.7.0' } dependencies { implementation "org.springframework.boot:spring-boot-starter-validation:${springBootVersion}" } ``` #### 方式二:依赖管理插件 ```gradle plugins { id 'io.spring.dependency-management' version '1.1.0' } dependencyManagement { imports { mavenBom "org.springframework.boot:spring-boot-dependencies:3.1.0" } } ``` --- ### **3. 验证依赖是否引入** 执行以下命令检查依赖树: ```bash ./gradlew dependencies --configuration runtimeClasspath | grep validation ``` 预期输出应包含: ``` +--- org.springframework.boot:spring-boot-starter-validation -> {version} | +--- org.hibernate.validator:hibernate-validator:7.0.5.Final | +--- jakarta.validation:jakarta.validation-api:3.0.2 ``` --- ### **4. 注意事项** 1. **Spring Boot 3.x 变更** 从 Spring Boot 3 开始,校验依赖基于 Jakarta EE 9+(包路径为 `jakarta.validation.*`),需确保代码中的注解同步更新: ```java import jakarta.validation.constraints.NotNull; // 非 javax ``` 2. **Kotlin 项目** 如果使用 Kotlin,需额外添加 `kotlin-reflect` 以支持注解反射: ```gradle implementation 'org.jetbrains.kotlin:kotlin-reflect' ``` --- ### **5. 完整示例(Gradle + Spring Boot 3.x)** ```gradle plugins { id 'java' id 'org.springframework.boot' version '3.1.0' } dependencies { implementation 'org.springframework.boot:spring-boot-starter-validation' implementation 'org.springframework.boot:spring-boot-starter-web' testImplementation 'org.springframework.boot:spring-boot-starter-test' } ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值