validation的简单使用

首先是依赖
我这里使用的是 web 工程,所以多一个web依赖

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

先尝试一下 项目是否都能跑起来

  1. 新建一个类,很简单对吧
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Student {
    private String name;
    private Integer age;
    private String mobile;
}
  1. 然后我们的接口如下,也非常简单对吧
@RequestMapping("/validation")
@RestController
public class ValidationController {

    @PostMapping("/test")
    public String test(@RequestBody Student student) {
        System.out.println(student);
        return "test";
    }
}
  1. 使用postman请求一下
    在这里插入图片描述
  2. 查看结果
    在这里插入图片描述

ok,下面我们不使用 validation 来校验一下参数,一般我们这么写

    @PostMapping("/test2")
    public String test2(@RequestBody Student student) {
        if (student == null) {
            throw new RuntimeException("student is null");
        }
        if (null == student.getAge() ||
                !StringUtils.hasText(student.getName()) ||
                !StringUtils.hasText(student.getMobile())) {
            throw new RuntimeException("parmeter has null value");
        }
        if (student.getAge() < 0) {
            throw new RuntimeException("age is less than 0");
        }
        if (student.getMobile().length() != 11) {
            throw new RuntimeException("mobile length is not 11");
        }
        System.out.println(student);
        return "test";
    }

看着很麻烦,杂乱,即便是将其抽出去,单成一个方法,也只是眼不见心不烦而已。

下面我们使用 validation 来写

@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Student {
    @NotBlank(message = "名字不能为空")
    private String name;

    @DecimalMax(value = "150", message = "年龄不能大于150,除非您是神仙")
    @DecimalMin(value = "0", message = "年龄不能小于0,除非您还没出生")
    private Integer age;

    private String mobile;
}
    @PostMapping("/test3")//注意看,这里也多了一个@Valid 注解
    public String test3(@RequestBody @Valid Student student) {
        System.out.println(student);
        return "test";
    }

我们请求一下:
在这里插入图片描述
请求失败,看一下控制台
在这里插入图片描述
虽然实现了,但是我们更希望 我们的报错信息能返回给前端,而不是输出在控制台。
所以我们还需要做一个异常全局捕获处理,我这里写一个简单的

/*异常全局处理*/
@RestControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(value = Exception.class)
    public String exceptionHandler(Exception e) {
        return e.getMessage();
    }
}

这样之后,效果如下
在这里插入图片描述

下面我们编写一个自定义的 参数检验方法,就用于我们的 mobile 字段,就比如:必须 11位,并且是数字1开头,这个逻辑是现有的注解实现不了的,只能自己写

那么问题就是怎么写,我们找一个现成的 @NotNull复制一下,改改代码

@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR,
        ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(
        validatedBy = {MobileValidator.class}//注意,这里是需要我们自己写的
)
public @interface Mobile {
    String message() default "手机号码有误";

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

    Class<? extends Payload>[] payload() default {};
    
}
public class MobileValidator implements ConstraintValidator<Mobile, String> {
    /*这两个泛型,前者是注解类型 ,后者是 要检验的值是什么类型*/

    @Override
    public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
        /*s就是前端传过来的值*/
        return StringUtils.hasText(s) && s.length() == 11 && s.startsWith("1");
    }
}

然后我们将自定义的 Mobile 用起来

@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Student {
    @NotBlank(message = "名字不能为空")
    private String name;

    @DecimalMax(value = "150", message = "年龄不能大于150,除非您是神仙")
    @DecimalMin(value = "0", message = "年龄不能小于0,除非您还没出生")
    private Integer age;

    @Mobile//这里用起来
    private String mobile;
}

我们请求一下

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/595263.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

兄弟Brother数控机床网络IP配置设置教程

1、进入通讯参数页面 首先按下面板的数据库按钮&#xff1a; 按F6&#xff0c;选择通信参数&#xff1a; 2、调整网络和远程访问参数 数据改写&#xff08;从属&#xff09;从否改为是&#xff0c;远程操作从无效改为有效&#xff1a; 更改ip地址、网关、子网掩码等&#xff…

MyBatis高级扩展

五、MyBatis高级扩展 5.1 Mapper批量映射优化 需求Mapper 配置文件很多时&#xff0c;在全局配置文件中一个一个注册太麻烦&#xff0c;希望有一个办法能够一劳永逸。 配置方式Mybatis 允许在指定 Mapper 映射文件时&#xff0c;只指定其所在的包&#xff1a; <mappers&…

融资融券利率最低多少:一文了解2024年最低融资融券开通攻略(利率4%-5%)

一、什么是融资融券利率&#xff1f; 融资融券利率通常指的是投资者在进行融资融券交易时需要支付给券商的利息费用的比率&#xff08;年化利率&#xff09;。 具体来说&#xff0c;融资融券利率包括两部分&#xff1a; 1、融资利率&#xff1a;这是客户借入资金进行证券买入…

easy_ssti_ctfshow_2023愚人杯

https://ctf.show/challenges#easy_ssti-3969 2023愚人杯有提示app.zip&#xff0c;访问 https://1f660587-5340-4b20-b929-c4549d9a5d4b.challenge.ctf.show/app.zip得到压缩包&#xff0c;拿到一个py文件 可以看到参数名是name&#xff0c;对参数进行筛选&#xff0c;包含ge…

安卓动态加载view

目录 前言一、addview1.1 addView 的重载方法1.2 在 LinearLayout 中的使用1.2.1 addView(View child)方法的分析&#xff1a;1.2.2 addView(View child, int index)方法的分析&#xff1a;1.2.3 小结 1.3 在 RelativeLayout 中的使用 二、addContentview2.1 测试 12.2 测试 22…

深度学习之基于Pytorch姿态估计的仰卧起坐计数系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 仰卧起坐作为一种常见的健身动作&#xff0c;被广泛用于腹部肌肉的锻炼。然而&#xff0c;对于仰卧起…

Java17 --- SpringCloud之Nacos

目录 一、下载nacos并运行 1.1、创建9001微服务作为提供者 1.2、创建80微服务作为消费者 二、naocs配置中心规则与动态刷新 2.1、创建3377微服务 2.2、在nacos中创建配置文件 三、nacos数据模型之Namespace-Group-Datald 3.1、DatalD方案 3.2、Group方案 3.3、Name…

Vite构造Vue3

环境安装 node.js安装-CSDN博客 初始化Vue项目安装脚手架_vue init webpack安装脚手架-CSDN博客 选择Vue框架 &#xff0c;项目名称可以自定义&#xff0c;我使用默认的 vite-project 选择JS 进入项目安装依赖

Windows平台通过MobaXterm远程登录安装在VMware上的Linux系统(CentOS)

MobaXterm是一个功能强大的远程计算工具&#xff0c;它提供了一个综合的远程终端和图形化的X11服务器。MobaXterm旨在简化远程计算任务&#xff0c;提供了许多有用的功能&#xff0c;使远程访问和管理远程服务器变得更加方便&#xff0c;它提供了一个强大的终端模拟器&#xff…

视频号小店在行业内的门槛高不高?有门槛是好事还是坏事?

大家好&#xff0c;我是电商小V 现在伴随着时代的慢慢发展&#xff0c;很多人都是想找一个好一点的创业项目&#xff0c;现在找创业项目都是找一些稍微有门槛的项目&#xff0c;没有门槛的话&#xff0c;要不然刚开始去做&#xff0c;项目就泛滥了&#xff0c;项目的红利期直接…

哪个牌子的电容笔好用?618五款爆款电容笔评测,不踩雷!

随着信息技术不断发展&#xff0c;iPad慢慢成为了现代年轻人工作、娱乐和学业的必备智能工具之一。然而&#xff0c;市场上涌现出众多品牌的电容笔&#xff0c;也存在着大量低质量的电容笔产品。这些产品往往无法达到预期的书写和绘画效果&#xff0c;反而可能导致用户体验不佳…

【kali换源之后签名无效,报错处理】

#一、问题&#xff1a;报错信息# 错误:1 http://mirrors.ustc.edu.cn/kali kali-rolling InRelease 错误:2 http://mirrors.tuna.tsinghua.edu.cn/kali kali-rolling InRelease 错误:3 http://dl.google.com/linux/chrome/deb stable InRelease 错误:4 http://mirrors.aliyu…

PyQt5中重要的概念:信号与槽

PyQt中信号与槽概念定义如下&#xff08;网络上引用的&#xff09;&#xff1a; 信号&#xff08;signal&#xff09;和槽&#xff08;slot&#xff09;是Qt的核心机制&#xff0c;也是在PyQt编程中对象之间进行通信的机制。在创建事件循环之后&#xff0c;通过建立信号和槽的…

2024上半年软考机考新政策:科目连考、分批次考试

辽宁省信息技术教育中心发布了《关于2024年上半年计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试批次安排的通知》。 该通知明确了2024上半年软考辽宁考区的考试时间、考试方式、考试批次安排&#xff0c;与2023下半年软考机考形式有多处调整。 1、考试时间&am…

vtk教程:禁止VTK弹出警告窗口warning

在使用VTK&#xff08;Visualization Toolkit&#xff09;进行可视化操作时&#xff0c;有时候会弹出警告窗口&#xff08;warning messages&#xff09;&#xff0c;这些警告可能是由于数据问题或是API使用不当等原因触发的。 如果你希望在使用VTK时禁用这些警告窗口&#xff…

【微信小程序开发】微信小程序注册,配置开发者工具

准备工作 微信小程序小程序开发流程 开发过程注册小程序开发者工具开发界面介绍 微信小程序 一种新的开发能力&#xff0c;可以在微信内被便捷的获取和传播&#xff0c;具有出色的用户体验 地址&#xff1a;https://mp.weixin.qq.com/ 注册微信小程序 在进行开发之前我们应该…

09 华三 SSH

03 华三SSH 远程登录 1 AI解说官网 Kimi.ai - 帮你看更大的世界 (moonshot.cn) 华三交换机的SSH配置主要目的是通过SSH协议实现安全的远程登录和管理&#xff0c;以确保数据传输的安全性。以下是配置SSH的一般步骤和思路&#xff1a; 生成密钥对&#xff1a;首先需要在交换…

【重要】MThings V0.6.3更新要点

我们听到了您的声音并采取了行动&#xff01;现在为您提供了一次全面的软件升级&#xff0c;让您的体验更加顺畅、稳定和安全。立即更新&#xff0c;畅享新功能&#xff01; 下载地址&#xff1a; http://gulink.cn/download 重要通知&#xff1a; 摩尔信使MThings即将发布全新…

从ChatGPT革命性的对话系统,看人机交互模式6个阶段的演变

ChatGPT引领革命&#xff0c;看人机交互六步飞跃 ©作者|wy 来源|神州问学 引言 在科技的浪潮中&#xff0c;人机交互模式不断演进&#xff0c;从最初的简单指令输入到如今的智能对话系统&#xff0c;每一次革新都昭示着人类与机器交流方式的深刻变革。ChatGPT&#xff0…

小吉/希亦/鲸立内衣洗衣机怎么样?深度测评谁更好用!

内衣洗衣机是近几年新兴的家电产品&#xff0c;以清洁效果好、除菌能力强&#xff0c;被很多人种草入手了&#xff01;但网上有不少人虽感兴趣&#xff0c;但不清楚如何选。担心买到质量差&#xff0c;清洗不干净的产品。作为一名家电测评博主&#xff0c;我今天特意围绕被问最…