关于对象入参的校验,我们可能第一个想到的就是在Controller层或者Service层增加很多if else的判断,如:

if (user.getPassword() == "") {
throw new BusinessException("password can not be empty!");
} if (user.getRank() > 30 || user.getRank() <= -1) {
throw new BusinessException("The value of the rank should be in valid range");
}
// other codes

这样一路写下来非常容易心态暴躁,时间久了也会越来越冗余。Spring Boot提供了一个通过注解就能实现的字段验证方法。常用的注解如下:

//被注释的元素必须为null
@Null
//被注释的元素不能为null
@NotNull
//被注释的元素必须为true
@AssertTrue
//被注释的元素必须为false
@AssertFalse
//被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Min(value)
//被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@Max(value)
//被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@DecimalMin(value)
//被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMax(value)
//被注释的元素的大小必须在指定的范围内。
@Size(max,min)
//被注释的元素必须是一个数字,其值必须在可接受的范围内
@Digits(integer,fraction)
//被注释的元素必须是一个过去的日期
@Past
//被注释的元素必须是一个将来的日期
@Future
//被注释的元素必须符合指定的正则表达式。
@Pattern(value)
//被注释的元素必须是电子邮件地址
@Email
//被注释的字符串的大小必须在指定的范围内
@Length
//被注释的字符串必须非空
@NotEmpty
//被注释的元素必须在合适的范围内
@Range

而我们选出最高频的三个:

@NotNull用于Integer Double等类型

@NotBlank 用于String字符串

@NotEmpty 用于集合类或者数组。

这些验证注解都写在Bean对象,也就是pojo或者dao层文件中,下面举个栗子:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class MyArticle {
// 文章ID
private int id;
// 文章标题
@NotBlank(message = "文章标题不能是空")
private String title;
// 文章作者
@NotBlank(message = "作者名不能是空")
private String author;
// 文章内容
@NotBlank(message = "文章内容不能是空")
private String content;
// 文章分类ID
@NotNull(message = "分类ID不能为空")
private int categoryId;
// 标签
@NotEmpty(message = "标签不能为空")
private List<String> tags;
// 创建时间
private int created;
// 修改时间
private int modified;
}

然后在对应的Controller接口中需要被验证的入参上增加一个注解@Validated即可,然后通过BindingResult对象来获取判断后的处理结果:

@PostMapping("/article")
@UserLoginToken
public Result add(@Validated @RequestBody MyArticle myArticle, BindingResult bindingResult) {
try {
if (bindingResult.hasErrors()) {
return new Result("400", "新发布文章失败!", bindingResult.getFieldError().getDefaultMessage(), "Bad Params", null);
}
boolean addResult = articleService.add(myArticle);
if (addResult) {
return new Result("200", "新发布文章成功!", "", "", null);
} else {
return new Result("200", "新发布文章失败!", "Oops, something weird", "10010", null);
}
} catch (Exception e) {
return new Result("400", "新发布文章失败!", e.getMessage(), "Bad Params", null);
}
}

一般情况下就结束了,但是等一下,你如果和我一样都是使用的高版本的Spring Boot,也就是2.3.x系列,那么以上增加的校验数据的注解会失效。这是由于高版本的Spring Boot需要单独手动安装Validate依赖包,在pom.xml文件中增加如下依赖:

<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.17.Final</version>
<scope>compile</scope>
</dependency>

安装好之后,重启项目,一切搞定!

解放生产力,从善用注解校验开始吧!

解放生产力:Spring Boot的注解校验的更多相关文章

  1. Spring Boot常用注解总结

    Spring Boot常用注解总结 @RestController和@RequestMapping注解 @RestController注解,它继承自@Controller注解.4.0之前的版本,Spr ...

  2. spring boot常用注解使用小结

    1.@RestController和@RequestMapping注解 4.0重要的一个新的改进是@RestController注解,它继承自@Controller注解. 4.0之前的版本,Sprin ...

  3. spring boot 常用注解

    @RestController和@RequestMapping注解 4.0重要的一个新的改进是@RestController注解,它继承自@Controller注解.4.0之前的版本,spring M ...

  4. Spring Boot 常用注解汇总

    一.启动注解 @SpringBootApplication @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documen ...

  5. 3个Spring Boot核心注解,你知道几个?

    Spring Boot 核心注解讲解 Spring Boot 最大的特点是无需 XML 配置文件,能自动扫描包路径装载并注入对象,并能做到根据 classpath 下的 jar 包自动配置. 所以 S ...

  6. Spring Boot@Component注解下的类无法@Autowired的问题

    title: Spring Boot@Component注解下的类无法@Autowired的问题 date: 2019-06-26 08:30:03 categories: Spring Boot t ...

  7. Spring boot 基于注解方式配置datasource

    Spring boot 基于注解方式配置datasource 编辑 ​ Xml配置 我们先来回顾下,使用xml配置数据源. 步骤: 先加载数据库相关配置文件; 配置数据源; 配置sqlSessionF ...

  8. 【SpringBoot】15. Spring Boot核心注解

    Spring Boot核心注解 1 @SpringBootApplication 代表是Spring Boot启动的类 2 @SpringBootConfiguration 通过bean对象来获取配置 ...

  9. spring boot纯注解开发模板

    简介 spring boot纯注解开发模板 创建项目 pom.xml导入所需依赖 点击查看源码 <dependencies> <dependency> <groupId& ...

随机推荐

  1. day23:单继承&多继承&菱形继承&__init__魔术方法

    1.单继承 1.1 关于继承的一些基本概念 1.2 子类可以调用父类的公有成员 1.3 子类无法调用父类的私有成员 1.4 子类可以改写父类的方法 2.多继承 2.1 多继承的基本语法 2.2 sup ...

  2. Hive: Reflect UDF

    Reflect UDF JAVA类和方法通常用于处理用户希望在hive中使用的确切的函数.相比与封装一个UDF然后调用这个方法,这些 方法主要通过反射UDF去调用.Reflect使用Java反射去实例 ...

  3. Vue + ccropper.js裁切图片(vue-cropper)

    按原比例裁剪图片并且不失真. 安装: cnpm install vue-cropper --save-dev 使用: <template> <div style="disp ...

  4. Python实现迪杰斯特拉算法

    首先我采用邻接矩阵法来表示图(有向图无向图皆可) 图的定义如下: class Graph: def __init__(self, arcs=[]): self.vexs = [] self.arcs ...

  5. C++输出错误信息perror、strerror以及全局变量errno

    头文件:#include<stdio.h>函数:perror.strerror,全局变量:errno.使用方法: FILE *fp; if((fp = fopen("test.t ...

  6. 2020-07-09:mysql如何开启慢查询?

    福哥答案2020-07-09: 1.参数说明 slow_query_log 慢查询开启状态slow_query_log_file 慢查询日志存放的位置(这个目录需要MySQL的运行帐号的可写权限,一般 ...

  7. 实践Kong for Kubernetes(K8S),kong最新2.1版本和kong-ingress-controller:0.9.1版本

    先决条件 Kubernetes集群:您可以使用Minikube或GKE集群.Kong与Kubernetes的所有发行版兼容. kubectl访问权限:您应该已经kubectl安装并配置为与Kubern ...

  8. 【深度学习】:一门入门3D计算机视觉

    一.导论 目前深度学习已经在2D计算机视觉领域取得了非凡的成果,比如使用一张图像进行目标检测,语义分割,对视频当中的物体进行目标跟踪等任务都有非常不错的效果.传统的3D计算机视觉则是基于纯立体几何来实 ...

  9. 总结vue知识体系之实用技巧

    vue 作为目前前端三大框架之一,对于前端开发者可以说是必备技能.那么怎么系统地学习和掌握 vue 呢?为此,我做了简单的知识体系体系总结,不足之处请各位大佬多多包涵和指正,如果喜欢的可以点个小赞!本 ...

  10. 《MySQL必知必会》检索数据,排序检索数据(select ,* ,distinct ,limit , . , order by ,desc)

    <MySQL必知必会>检索数据,排序检索数据 1.检索数据 1.1 select 语句 为了使用SELECT检索表数据,必须至少给出两条信息一想选择什 么,以及从什么地方选择. 1.2 检 ...