(一)常用注解

//开启验证,标注在待验证的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(验证)相关推荐

  1. (二)SpringBoot 整合 JPA

    一.JPA简介 JPA(java persistence api)并不是一个框架,而是一组规范.Hibernate.TopLink.OpenJPA都实现了JPA规范,不过Hinernate最成功).所 ...

  2. Redis学习笔记(二)SpringBoot整合

    Redis学习笔记(二) SpringBoot整合 测试 导入依赖 查看底层 配置连接 测试连接 自定义`RedisTemplate` 在开发中,一般都是以json来传输对象: 所以实际开发中所有对象 ...

  3. 二、springBoot 整合 mybatis 项目实战

    文章目录 前言 引入mybatis依赖 Entry层 Dao 层 Service 层 service 接口 serviceImpl 具体实现类. controller 层 测试 配置多环境文件 配置日 ...

  4. 七十二、Springboot整合MyBatis(配置文件版)

    @Author:Runsen 来源:尚硅谷 下面建议读者学习尚硅谷的B站的SpringBoot视频,我是学雷丰阳视频入门的. 具体链接如下:B站尚硅谷SpringBoot教程 MyBatis官方文档: ...

  5. (二)springboot整合之knife4j(详细)

    knife4j除了引入依赖和配置启动类和swagger不一样其他都一样 1.创建项目 2.引入依赖 <!-- knife4j接口文档 start --> <dependency> ...

  6. Https双向验证与Springboot整合测试-人来人往我只认你

    1 简介 不知不觉Https相关的文章已经写了6篇了,本文将是这个专题的最后一篇,起码近期是最后一篇.前面6篇讲的全都是单向的Https验证,本文将重点介绍一下双向验证.有兴趣的同学可以了解一下之前的 ...

  7. SpringBoot整合Shiro实现权限控制,验证码

    本文介绍 SpringBoot 整合 shiro,相对于 Spring Security 而言,shiro 更加简单,没有那么复杂. 目前我的需求是一个博客系统,有用户和管理员两种角色.一个用户可能有 ...

  8. 【七】springboot整合redis(超详细)

    springboot篇章整体栏目: [一]springboot整合swagger(超详细 [二]springboot整合swagger(自定义)(超详细) [三]springboot整合token(超 ...

  9. springboot整合图像数据库Neo4j

    百度百科: Neo4j是一个高性能的,NOSQL图形数据库,它将结构化数据存储在网络上而不是表中.它是一个嵌入式的.基于磁盘的.具备完全的事务特性的Java持久化引擎,但是它将结构化数据存储在网络(从 ...

最新文章

  1. 王爽著的《汇编语言》第3版笔记
  2. 【转发】什么时候该用委托,为什么要用委托,委托有什么好处
  3. 记录一次mysql不能启动的解决方案
  4. python 网络编程--socket模块/struct模块
  5. 四、用户、群组和权限(未完结)
  6. JavaME程序 Run Anywhere-- 利用反射机制来动态加载声
  7. 用python进行营销分析_用python进行covid 19分析
  8. [转载] java避免空指针异常_第1部分:在现代Java应用程序中避免空指针异常
  9. ajax.request提交,ajax request 请求
  10. 一文掌握常用的机器学习模型(免费课程+送书福利)
  11. 【codevs3153】【BZOJ3895】取石子游戏,博弈论之记忆化搜索
  12. ENVI二次开发时的注意事项
  13. Vue- Markdown 使用大全
  14. javascript 简易时钟
  15. BT5 WIFI破解
  16. css点击按钮改变样式
  17. 华为机试练习(十二)叠积木
  18. 网络爬虫技术是什么,网络爬虫的基本工作流程是什么?
  19. 智能合约节省GAS的小技巧:避免使用>=和<=
  20. cisco 模拟器安装及交换机的基本配置实验心得_软考网络工程师级配置题总结 | 交换机配置、路由器配置、广域网接入配置、L2TP配置、IPSec配置、PIX防火墙配置...

热门文章

  1. ASP.NET CORE下用盛派微信SDK取微信openid
  2. 盛派SDK开发公众号获取用户输入上下文
  3. 招聘一位优秀的工程师
  4. 启用树莓派3的Uart
  5. Net Core 3.1 中使用JWT认证
  6. 愚人节整人软件测试,愚人节整蛊iOS应用专题 PP助手“愚”你没商量
  7. 人工智能红利到来的核心标志,首先是要有能看得见的场景
  8. mysql 默认 innodb_【数据库】Mysql更改默认引擎为Innodb的步骤方法
  9. 往华为云服务器上传文件速度特别慢,怎么办?
  10. Python入门数学类编程——编写数学计算程序