二十七、Springboot整合Validation(验证)
(一)常用注解
//开启验证,标注在待验证的Object对象上
@Valid//标注在待验证的字段上
@NotNull
@Null
@Size
@Min
@Max
(二)具体使用
1、添加依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency>
2、创建待验证的Object,并添加验证注解
public class Person {/*** @PersonName(prefix = "潘"):自定义注解*/@NotNull@PersonName(prefix = "潘")private String name;@Min(value = 12)@Max(value = 30, message = "超过30岁的不要!")private Integer age;
}
3、创建自定义校验注解类@PersonName
备注:
重点一:所有的自定义注解类都可以参照下面的类创建。
重点二:必须注意@Constraint注解,绑定具体的校验实现类
/*** 自定义校验注解* @author 咸鱼* @date 2018/10/14 17:57* 重点:使用@Constraint(validatedBy = {PersonNameConstraintValidator.class})绑定具体的校验实现类*/
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RUNTIME)
@Repeatable(PersonName.List.class)
@Documented
@Constraint(validatedBy = {PersonNameConstraintValidator.class})
public @interface PersonName {String message() default "";Class<?>[] groups() default { };Class<? extends Payload>[] payload() default { };/*** 定义名字必须以**前缀开始*/String prefix() default "";@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })@Retention(RUNTIME)@Documented@interface List {PersonName[] value();}
}
4、创建自定义校验注解的具体实现类
/*** ConstraintValidator<PersonName, String>:* 泛型一:校验的注解类* 泛型二:被校验的对象类型*/
public class PersonNameConstraintValidator implements ConstraintValidator<PersonName, String> {private String prefix;/*** @param constraintAnnotation 待校验注解的所有信息*/@Overridepublic void initialize(PersonName constraintAnnotation) {//取出注解中的数据this.prefix = constraintAnnotation.prefix();}/*** 在这里面定义校验规则* @param value 待校验对象* @param context* @return true 通过校验 false 无法通过校验*/@Overridepublic boolean isValid(String value, ConstraintValidatorContext context) {//校验规则为:名字必须以#{prefix}开头if (!value.startsWith(prefix)){/*** 自定义校验错误信息*/context.disableDefaultConstraintViolation();ConstraintValidatorContext.ConstraintViolationBuilder builder =context.buildConstraintViolationWithTemplate("人的名字必须以\"" + prefix + "\"起始");builder.addConstraintViolation();return false;}return true;}
}
5、使用案例
/*** 开启校验注解:@Valid*/
@RestController
public class PersonController {@PostMapping("/person")public Person savePerson(@Valid @RequestBody Person person){return person;}
}
(三)校验拓展,统一异常处理
问题:以上的案例,当无法通过校验时,会返回400错误,但是我们一般都会做全局异常处理,返回400错误,将导致我们没法统一处理这个异常?
解决办法:
当无法通过校验时,校验结果会存到BindingResult
对象中,我们可以通过该对象截取校验信息,然后将该异常抛出去,进行统一异常处理。
/*** 增* “@Valid”开启校验* BindingResult:存放校验结果*/@PostMapping("/girls")public Girl addGirl(@Valid Girl girl, BindingResult bindingResult){//若不符合约束if (bindingResult.hasErrors()){//获取不符合约束时,自定义的异常信息throw new **Exception(bindingResult.getFieldError().getDefaultMessage());}return girlService.addGirl(girl);}
二十七、Springboot整合Validation(验证)相关推荐
- (二)SpringBoot 整合 JPA
一.JPA简介 JPA(java persistence api)并不是一个框架,而是一组规范.Hibernate.TopLink.OpenJPA都实现了JPA规范,不过Hinernate最成功).所 ...
- Redis学习笔记(二)SpringBoot整合
Redis学习笔记(二) SpringBoot整合 测试 导入依赖 查看底层 配置连接 测试连接 自定义`RedisTemplate` 在开发中,一般都是以json来传输对象: 所以实际开发中所有对象 ...
- 二、springBoot 整合 mybatis 项目实战
文章目录 前言 引入mybatis依赖 Entry层 Dao 层 Service 层 service 接口 serviceImpl 具体实现类. controller 层 测试 配置多环境文件 配置日 ...
- 七十二、Springboot整合MyBatis(配置文件版)
@Author:Runsen 来源:尚硅谷 下面建议读者学习尚硅谷的B站的SpringBoot视频,我是学雷丰阳视频入门的. 具体链接如下:B站尚硅谷SpringBoot教程 MyBatis官方文档: ...
- (二)springboot整合之knife4j(详细)
knife4j除了引入依赖和配置启动类和swagger不一样其他都一样 1.创建项目 2.引入依赖 <!-- knife4j接口文档 start --> <dependency> ...
- Https双向验证与Springboot整合测试-人来人往我只认你
1 简介 不知不觉Https相关的文章已经写了6篇了,本文将是这个专题的最后一篇,起码近期是最后一篇.前面6篇讲的全都是单向的Https验证,本文将重点介绍一下双向验证.有兴趣的同学可以了解一下之前的 ...
- SpringBoot整合Shiro实现权限控制,验证码
本文介绍 SpringBoot 整合 shiro,相对于 Spring Security 而言,shiro 更加简单,没有那么复杂. 目前我的需求是一个博客系统,有用户和管理员两种角色.一个用户可能有 ...
- 【七】springboot整合redis(超详细)
springboot篇章整体栏目: [一]springboot整合swagger(超详细 [二]springboot整合swagger(自定义)(超详细) [三]springboot整合token(超 ...
- springboot整合图像数据库Neo4j
百度百科: Neo4j是一个高性能的,NOSQL图形数据库,它将结构化数据存储在网络上而不是表中.它是一个嵌入式的.基于磁盘的.具备完全的事务特性的Java持久化引擎,但是它将结构化数据存储在网络(从 ...
最新文章
- 王爽著的《汇编语言》第3版笔记
- 【转发】什么时候该用委托,为什么要用委托,委托有什么好处
- 记录一次mysql不能启动的解决方案
- python 网络编程--socket模块/struct模块
- 四、用户、群组和权限(未完结)
- JavaME程序 Run Anywhere-- 利用反射机制来动态加载声
- 用python进行营销分析_用python进行covid 19分析
- [转载] java避免空指针异常_第1部分:在现代Java应用程序中避免空指针异常
- ajax.request提交,ajax request 请求
- 一文掌握常用的机器学习模型(免费课程+送书福利)
- 【codevs3153】【BZOJ3895】取石子游戏,博弈论之记忆化搜索
- ENVI二次开发时的注意事项
- Vue- Markdown 使用大全
- javascript 简易时钟
- BT5 WIFI破解
- css点击按钮改变样式
- 华为机试练习(十二)叠积木
- 网络爬虫技术是什么,网络爬虫的基本工作流程是什么?
- 智能合约节省GAS的小技巧:避免使用>=和<=
- cisco 模拟器安装及交换机的基本配置实验心得_软考网络工程师级配置题总结 | 交换机配置、路由器配置、广域网接入配置、L2TP配置、IPSec配置、PIX防火墙配置...