SpringBoot 校验框架pom依赖,注解校验,嵌套校验,分组校验、条件校验

工程依赖

SpringBoot....
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>
Maven...
<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
    <version>2.0.1.Final</version>
</dependency>
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>6.2.3.Final</version>
</dependency>
<dependency>
    <groupId>org.jboss.logging</groupId>
    <artifactId>jboss-logging</artifactId>
    <version>3.4.3.Final</version>
</dependency>
<dependency>
    <groupId>com.fasterxml</groupId>
    <artifactId>classmate</artifactId>
    <version>1.5.1</version>
</dependency>

通用校验

Controller...
public Object test(@RequestBody @Validated ReqBO reqBO, BindingResult bindingResult) {
    if (bindingResult.hasErrors()) {
        List<ObjectError> allErrors = bindingResult.getAllErrors();
        StringBuilder sbu = new StringBuilder();
        allErrors.forEach(it -> sbu.append(it.getDefaultMessage()).append(";"));
    }
    System.out.println(allErrors);
    return null;
}
ReqBO...

@Data
public class ReqBO{
    @NotEmpty(message = "id不可为空!")
    private String id;

    private Person person;
    ...
}

入参id为空的时候就会提示定义的message,有些校验的message中可以使用变量。

穿透校验

对于BO嵌套BO的场景,需要对里层的BO进行判断。可对ReqBO 的Person加上注解@Valid

ReqBO...

@Data
public class ReqBO{
    @NotEmpty(message = "id不可为空!")
    private String id;

    @Valid
    private Person person;
    ...
}
Person...

public class Person{

    @NotEmpty(message = "名字不可为空!")
    @Length(max = 6, message = "名字最大长度为{max}")
    private String name;

    private int age;
}

有点场景要求要么Person对象为空的,要么Person对象里的属性全都不能为空,则将Person的属性都增加上校验。

若要求Person对象也不能为空,则

ReqBO...

@Data
public class ReqBO{
    @NotEmpty(message = "id不可为空!")
    private String id;

    @Valid
    @NotEmpty(message = "Person不可为空!")
    private Person person;
    ...
}

同样支持List<Person>的场景

分组校验

Spring开发中会遇到这样的场景,同一个BO对象(包含嵌套其他BO)被用于不同的入口,入口之间所校验的属性不同,比如对于同一个属性有的需要判断非空,有的不需要判断。

ReqBO...
@Data
public class ReqBO {

    public interface Default{}

    public interface Other{}

    @NotEmpty(message = "id不可为空!", groups = ReqBO.Default.class)
    private String id;

    @NotEmpty(message = "note不可为空!", groups = ReqBO.Other.class)
    private String note;

    @Valid
    @NotEmpty(message = "Person不可为空!", groups = {ReqBO.Other.class, ReqBO.Default.class})
    private Person person;
}

   Controller...
      public Object test1( @Validated(ReqBO.Default.class) ReqBO reqBO, BindingResult bindingResult) {
        ...
        return null;
    }
    public Object test2( @Validated(ReqBO.Other.class) ReqBO reqBO, BindingResult bindingResult) {
        ...
        return null;
    }
    public Object test3( @Validated({ReqBO.Default.class,ReqBO.Other.class}) ReqBO reqBO, BindingResult bindingResult) {
        ...
        return null;
    }
  1. 定义分组interface
  2. 属性增加groups(可指定多组)
  3. Controller加入分组(可指定多组)

组别相同才能校验。被验证的属性如果有分组,但是Controller没有指定任何分组,则不会校验

条件校验

最开始想根据业务对同一个字段进行区别校验,使用“条件判断”作为搜索条件没有找到相关信息,后发现分组判断可以解决。

对于项目中还有个场景需要根据某个属性值不同,对其他的属性进行非空判断,比如:属性O的值是1时需要对属性A做非空判断,当属性O的值是2时需要对属性B做非空判断。也没有找到合适的注解配置,因此在代码中实现的。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

as350144

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

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

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

打赏作者

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

抵扣说明:

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

余额充值