Java后端数据校验

数据校验

普通校验

普通校验是基础用法,非常容易,首先用户要在SpringBootWeb项目中添加数据校验相关依赖,代码如下:

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

项目创建成功后,查看LocalValidatorFactoryBean类的源码,发现默认的ValidationMessageSource(校验出错时的提示文件)是resources目录下的ValidationMessages.properties文件,
因此在resources目录下创建ValidationMessages.properties文件,内容如下:

user.name.size=用户名长度介于5到10个字符之间
user.address.notnull=用户地址不能为空
user.age.size=年龄输入不正确
user.email.notnull=邮箱不能为空
user.email.pattern=邮箱格式不正确

接下来创建User类,配置数据校验,代码如下:

@Data
public class User {

    private Integer id;
    @Size(min = 5,max = 10,message = "{user.name.size}")
    private String name;
    @NotNull(message = "{user.address.notnull}")
    private String address;
    @DecimalMin(value = "1",message = "{user.age.size}")
    @DecimalMax(value = "200",message = "{user.age.size}")
    private Integer age;
    @Email(message = "{user.email.pattern}")
    @NotNull(message = "{user.email.notnull}")
    private String email;

}

配置完成后,接下来创建UserController,代码如下:

@RestController
public class UserController {
    @PostMapping("/user")
    public List<String> addUser(@Validated User user, BindingResult result){
        List<String> errors = new ArrayList<>();
        if (result.hasErrors()){
            List<ObjectError> allErrors = result.getAllErrors();
            for (ObjectError error : allErrors) {
                errors.add(error.getDefaultMessage());
            }
        }
        return errors;
    }
}

代码解释:

  • 给User参数添加@Validated注解,表示需要对该参数做校验,紧接着的BindingResult参数表示在校验出错时保存的出错信息。
  • 如果BindingResult中的hasErrors方法返回true,表示在错误信息,此时遍历错误信息,将之返回给前端。

配置完成后,接下来使用postman测试,直接访问“/user”接口,返回结果如下图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-URTU2qyj-
在这里插入图片描述

分组校验

有的时候,开发者在实体类中定义了很多校验规则,但是在某一次业务处理中,并不需要这么多校验规则,此时就可以使用分组校验。分组校验步骤如下:

首先创建两个分组接口,代码如下:

public interface ValidationGroup1 {
}

public interface ValidationGroup2 {
}

然后在实体类中添加分组信息,代码如下:

@Data
public class User {

    private Integer id;
    @Size(min = 5,max = 10,message = "{user.name.size}",groups = ValidationGroup1.class)
    private String name;
    @NotNull(message = "{user.address.notnull}",groups = ValidationGroup2.class)
    private String address;
    @DecimalMin(value = "1",message = "{user.age.size}")
    @DecimalMax(value = "200",message = "{user.age.size}")
    private Integer age;
    @Email(message = "{user.email.pattern}")
    @NotNull(message = "{user.email.notnull}",groups = {ValidationGroup1.class,ValidationGroup2.class})
    private String email;

}

这次在部分注解中添加了groups属性,表示该校验规则所属的分组,接下来在@Validated中指定校验分组,代码如下:

@RestController
public class UserController {
    @PostMapping("/user")
    public List<String> addUser(@Validated(ValidationGroup2.class) User user, BindingResult result) throws UnsupportedEncodingException {
        List<String> errors = new ArrayList<>();
        if (result.hasErrors()){
            List<ObjectError> allErrors = result.getAllErrors();
            for (ObjectError error : allErrors) {
//                errors.add(new String(error.getDefaultMessage().getBytes(),"UTF-8"));
                errors.add(error.getDefaultMessage());
            }
        }
        return errors;
    }
}

@Validated(ValidationGroup2.class)表示这里的校验使用ValidationGroup2分组的校验规则,即只校验邮箱地址是否为空、用户地址是否为空,测试结果如下图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fKUNGW6k-
在这里插入图片描述

校验注解

校验注解注解的元素类型描述
AssertFalseBoolean、boolean被注解的元素值必须为false
AssertTrueBoolean、boolean被注解的元素值必须为true
DecimalMaxBigDecimal、BigInteger、CharSequence、byte、short、int、long以及它们各自的包装类被注解的值小于等于@DecimalMax注解中的value值
DecimalMinBigDecimal、BigInteger、CharSequence、byte、short、int、long以及它们各自的包装类被注解的值大于等于@DecimalMin注解中的value值
MaxBigDecimal、BigInteger、byte、short、int、long以及它们各自的包装类被注解的值小于等于@Max注解中的value值
MinBigDecimal、BigInteger、byte、short、int、long以及它们各自的包装类被注解的值大于于等于@Min注解中的value值
DigitsBigDecimal、BigInteger、CharSequence、byte、short、int、long以及它们各自的包装类被注解的元素必须是一个数字,其值必须在可接受的范围内(整数位数和小数位数必须在指定的范围内)
EmailCharSequence被注解的元素值必须是email格式
FutureJava.util.Date、Java.util.Calender以及java.time包下的时间类被注解的元素必须是一个未来的日期
PastJava.util.Date、Java.util.Calender以及java.time包下的时间类被注解的元素必须是一个过去的日期
PastOrPresentJava.util.Date、Java.util.Calender以及java.time包下的时间类被注解的元素必须是一个过去的日期或者当前日期
FutureOrPresentJava.util.Date、Java.util.Calender以及java.time包下的时间类被注解的元素必须是一个未来的日期或者当前日期
NegativeBigDecimal、BigInteger、byte、short、int、long以及它们各自的包装类被注解的元素必须是负数
NegativeOrZeroBigDecimal、BigInteger、byte、short、int、long以及它们各自的包装类被注解的元素必须是负数或0
PositiveBigDecimal、BigInteger、byte、short、int、long以及它们各自的包装类被注解的元素必须是正数
PositiveOrZeroBigDecimal、BigInteger、byte、short、int、long以及它们各自的包装类被注解的元素必须是正数或0
NotBlankCharSequence被注解的元素必须不为null并且至少有一个非空白字符
NotEmptyCharSequence、Collection、Map、Array被注解的字符串不为null或空字符串,被注解的集合或数组不为空。和@NotBlank相比,一个空字符串在@NotBlank中验证不通过,但是在@NotEmpty中验证可以通过。
NotNull任意类型被注解的元素不能为null
Null任意类型被注解的元素为null
PatternCharSequence被注解的元素必须符合指定正则表达式
SizeCharSequence、Collection、Map、Array被注解的字符串长度,集合或者数组的大小必须在指定的范围内
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值