IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 06 SpringBoot初体验:浅尝辄止参数校验 -> 正文阅读

[Java知识库]06 SpringBoot初体验:浅尝辄止参数校验

06 SpringBoot初体验:你也可以掌握的参数校验.md


代码在https://e.gitee.com/theskyone/projects/371312/repos/theskyone/new-bird

克隆 https://gitee.com/theskyone/new-bird.git

背景

我们有没有因为前端给的参数不合法导致服务出问题了呢?类型不匹配,字段超长等等等等…不管信不信任前端,接口参数校验都是后端接口实现不可少的一环。那我们的参数校验一般是怎么做的呢?当然简单一点,在业务逻辑的开始加个check方法,但好像很多时候我们的参数校验逻辑都是类似的,比如一个字段串字段长度多少多少,但是在不同的对象里却要校验不同的字段名,可不可以将参数校验的逻辑解耦开来呢,将相同的校验规则应用到不同的请求参数上?

那自然是可以的,也是我们今天的主角,javax.validation。

准备工作

啥是javax.validation?

其实就是我们想要的一套参数校验的标准(jsr303),这套标准定义了一些校验注解和校验器的抽象实现。后者我们先不关心,先看看有哪些常用的注解:

  1. @NotBlank:校验一个字符串不能为null也不能全是空格
  2. @NotEmpty:校验一个集合/Map不能为null也不能全是空格 -> 当然也可以是字符串啦,一般还是用在集合上分的清晰点
  3. @NotNull:emmm…
  4. @Size:限制一个集合/Map的元素个数,或者字符串的长度 -> 校验字符串长度比较好用
  5. @Pattern:可以按正则表达式校验哦

咦,好像有点东西,我们直接在不同对象的不同字段上标准这些相同的注解,就可以校验类似的逻辑了!思路瞬间清晰

ok,话不多说,让我们实际耍一下!

SpringBoot对javax.validation的整合

这块可以稍稍了解下哈,简单来说,jsr303是一套标准接口,那么谁做了实现呢?hibernate-validator,甚至它还扩展了@Range、@Length等等的注解。那么spring-boot-starter-validator也就默认集成了hibernate的实现。

这个原生的用法我们后面放个工具类好了,因为使用了springboot后实在是很少用自己写的工具类,当然对于一些没有被springboot集成的中间件,那在做数据交换的时候还是可以用用的~

那么SpringBoot整合成啥样了呢?我们直接看例子吧

实战

我们示例一个比较简单的接口参数校验,掌握基本的玩法~

项目配置

Maven依赖

翻车了┭┮﹏┭┮。嗐,springboot高版本从spring-boot-starter-web中把validation去掉了,得自己手动加

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

示例demo

一个需要校验参数的对象

我们加了个校验注解@Size(min=10,max=20),限制word的长度在[10,20]

package com.gitee.theskyone.bird.web.dto;

@Data
public class Hello {
    @Size(min = 10, max = 20)
    String word;

    public Hello(String word) {
        this.word = word;
    }

    @Override
    public String toString() {
        return "hello " + word + "~";
    }
}

一个提供服务的接口

package com.gitee.theskyone.bird.web;

@RestController
@Validated
public class HelloWorldController {

    @GetMapping("/hello/{world}")
    public Response<String> hello(@PathVariable @Size(min = =5, max = 10) String world) {
        String helloWorld = "hello " + world + " ~";
        // 第1种方式: 使用Response.success(helloWorld)返回
        return Response.success(helloWorld);
    }

    @GetMapping("/hello/{world}")
    public Response<Hello> hello2(@Valid Hello hello) {
        // 第1种方式: 使用Response.success(helloWorld)返回
        return Response.success(hello);
    }
}

这里一步到位了,说下其中的关键点:(小板凳坐好坐好)

  1. 第4行:加了一个**@Validated**,这个注解超级重要,只有加了这个注解的类或者接口才会校验参数!
  2. 第8行:对world单独加了个@Size(min = =5, max = 10),为啥呀,因为我们就是个String参数啊,不是对象,那这个时候我们也是可以对这个String校验的(小本本记好)
  3. 第15行:这里我们用上了请求的对象,但是加了个**@Valid注解,这个注解也炒鸡重要!为啥呢,因为我们的入参是Hello,但是是想要校验Hello对象中的字段呀!这时候是不是要级联到对象的字段上去啊!是的没错…甚至如果对象的字段也还是对象呢?聪明的你可能已经get了对吧,这个@Valid**就是来告诉校验器我要不要继续级联校验下去的(字字珠玑哦)

好了,没了,so easy,我抄我也会,那来试试效果吧!

看看效果,别翻车了

/hello2/word=123

{
    "code":"A0000",
    "message":"org.springframework.validation.BeanPropertyBindingResult: 1 errors\nField error in object 'hello' on field 'word': rejected value [123]; codes [Size.hello.word,Size.word,Size.java.lang.String,Size]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [hello.word,word]; arguments []; default message [word],20,10]; default message [个数必须在10和20之间]",
    "data":null
}

/hello/234

{
    "code":"A0000",
    "message":"javax.validation.ConstraintViolationException: hello.world: 个数必须在5和10之间",
    "data":null
}

nice,都报错了,看上去验证是OK的!但是产生的异常信息不一样对不对,在意细节的可以尝试追一追为什么哦~另外,这个提示是不是有点不好看啊,有兴趣的小伙伴还可以了解下自定义message和国际化哦!甚至我们去改它的默认提示也是可以滴!

附录

hibernate-validation校验工具类

package com.sankuai.oa.calendar.common.validator;


public final class Validation {

    private static final javax.validation.Validator VALIDATOR = javax.validation.Validation.buildDefaultValidatorFactory().getValidator();

    private static final javax.validation.Validator FAST_FAIL_VALIDATOR = javax.validation.Validation.byProvider(HibernateValidator.class).configure().failFast(true).buildValidatorFactory().getValidator();

    private Validation() {}

    public static <T> void valid(T pojo, Class<?>... groups) {
        valid(VALIDATOR, pojo, groups);
    }

    public static <T> void fastValid(T pojo, Class<?>... groups) {
        valid(FAST_FAIL_VALIDATOR, pojo, groups);
    }

    public static <T> void valid(javax.validation.Validator validator, T pojo, Class<?>... groups) {
        Assert.state(validator != null, "No Validator set");
        Set<ConstraintViolation<T>> violations = validator.validate(pojo, groups);

        if (violations.isEmpty()) {
            return;
        }

        StringBuilder sb = new StringBuilder();
        for (Iterator<ConstraintViolation<T>> it = violations.iterator(); it.hasNext(); ) {
            ConstraintViolation<T> violation = it.next();
            sb.append(violation.getPropertyPath()).append(" - ").append(violation.getMessage());
            if (it.hasNext()) {
                sb.append("; ");
            }
        }
        throw new ValidationException(sb.toString());
    }
}

这是个可以校验对象的工具类,支持分组校验。默认提供了2种validator,fastValidator就是检查到一个参数错误就会返回,包括springboot默认则是返回所有的参数校验错误。

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-07-20 18:38:23  更:2022-07-20 18:41:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 13:11:14-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码