Java框架篇_13 Spring Boot整合Validation参数校验

本文介绍了如何在SpringBoot中使用Validation和Hibernate Validator进行参数校验,包括引入依赖、常见约束注解的使用,以及通过groups字段实现不同场景的参数校验。示例展示了单参数和对象参数的校验方式,以及如何避免因参数个数不同导致的类冗余。
摘要由CSDN通过智能技术生成


在开发中,会经常需要进行参数的校验,比如接口层、业务层、持久层等,其
中接口的参数校验就是最为常见的。这里就来看一下 springboot 中参数校验(validation)的使用。

validation引入依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>

可用约束(constraint)

hibernate-validator 沿用了 validation-api 中的所有注解约束,同时也定义
了一些自己的约束:

constraint描述来源
@AssertFalse被约束的元素必须是falsevalidation-api
@AssertTrue被约束的元素必须是truevalidation-api
@DecimalMax被约束的元素必须是数字且其必须小于等于指定值validation-api
@DecimalMin被约束的元素必须是数字且其必须大于等于指定值validation-api
@Digits被约束的元素必须是数字且其在约束范围内validation-api
@Future被约束的元素是未来的时间validation-api
@Past被约束的元素是过去的时间validation-api
@Max被约束的元素是数字且其必须小于等于指定值validation-api
@Min被约束的元素是数字且其必须大于等于指定值validation-api
@NotNull被约束的元素不能为Nullvalidation-api
@Null被约束的元素必须为Nullvalidation-api
@Pattern被约束的元素必须符合指定的正则表达式validation-api
@Size被约束的元素必须在范围内validation-api
@URL被约束的元素必须是一个URLhiberate-validator
@ScriptAssert验证类级别脚本hiberate-validator
@SafeHtml被约束的元素必须是要给HTMLhiberate-validator
@Range被约束的元素必须是在[min,max]范围hiberate-validator
@ParameterScriptAssert验证参数级别脚本hiberate-validator
@NotEmpty验证字符串、集合、字典或数组是否为null或者空hiberate-validator
@NotBlank验证字符串是否为null或者空(支持去两端空字符)hiberate-validator
@Length验证字符串长度范围[min,max]hiberate-validator
@Email验证是否为emailhiberate-validator
@EAN检测字符序列是否有效hiberate-validator
@CreditCardNumber验证身份认证是否有效hiberate-validator

使用举例

  • 单参数校验,类上必须加@Validated
@Validated
@RestController
@RequestMapping("/student")
public class StudentApi {
    @GetMapping("/queryById")
    public Student queryById(@RequestParam("code")
                             @NotBlank(message = "code not null")
                             @Length(min = 4, max = 4,message = "长度必须为4")
                                     String id) {
        Student student = new Student();
        if ("1001".equals(id)) {
            student.setCode("1001");
            student.setName("Forward");
            student.setAge(21);
            student.setBirthday(new Date());
        }
        return student;
    }
}

测试响应成功!
在这里插入图片描述
当不满足约束时:
在这里插入图片描述

  • 使用一个对象来接收参数,只需要在对象中约束属性即可。
@Data
public class StudentInsertForm {
    @NotBlank
    @Length(min = 1, max = 15)
    @Pattern(regexp = "[A-z]")
    private String name;
    @NotNull
    @Range(min = 1, max = 100, message = "年龄范围须在1-100之间")
    private Integer age;
    private Date birth;
}
    /**
     * 使用封装的对象接收实体参数(Form对象)
     * 最常用
     * @RequestBody主要用来接收前端传递给后端的json字符串中的数据的(请求体中的数据的)
     */
    @PostMapping("/insert")
    public String insert(@RequestBody @Validated StudentInsertForm form) {
        System.out.println(form.getName());
        System.out.println(form.getAge());
        System.out.println(form.getBirth());
        return "success";
    }

当参数不满足约束时:
在这里插入图片描述

  • 当使用对象接收参数时,很多时候可能因为参数个数的不同而造成类的冗余,这时我们可以使用约束的groups字段
    比如说,我们插入只用到3个字段,而修改时还需要一个主键code字段,正常情况下我们创建两个类,而使用group字段,只需要创建接口。

创建对应功能的接口,接口中不需要写任何东西:

public interface Insert {
}
public interface Update {
}

接收参数的实体类:
哪个功能需要该字段,就在groups参数中添加上该功能的接口

@Data
public class StudentForm {
    @NotNull(groups = {Update.class})
    @Length(min = 4, max = 6, groups = {Update.class})
    private String code;
    @NotBlank
    @Length(min = 1, max = 15, groups = {Update.class, Insert.class})
    @Pattern(regexp = "[A-z]", groups = {Update.class, Insert.class})
    private String name;
    @NotNull(groups = {Update.class, Insert.class})
    @Range(min = 1, max = 100, message = "年龄范围须在1-100之间", groups = {Update.class, Insert.class})
    private Integer age;
    private Date birth;
}

最后在用到对应功能的地方加上功能接口

    @PostMapping("/insert2")
    public String insert2(@RequestBody @Validated({Insert.class}) StudentForm form) {
        System.out.println(form.getName());
        System.out.println(form.getAge());
        System.out.println(form.getBirth());
        return "success";
    }

    @PostMapping("/update")
    public String update(@RequestBody @Validated({Update.class}) StudentForm form) {
        System.out.println(form.getCode());
        System.out.println(form.getName());
        System.out.println(form.getAge());
        System.out.println(form.getBirth());
        return "success";
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值