服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|JavaScript|易语言|

服务器之家 - 编程语言 - Java教程 - Spring boot validation校验方法实例

Spring boot validation校验方法实例

2021-08-11 11:564年了还是个菜比 Java教程

这篇文章主要给大家介绍了关于Spring boot validation校验方法的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

前言

Spring boot validation校验方法实例

接触springboot一年多,是时候摆脱这种校验方式了233 ,每个参数都if判断,一眼看过去就是很low的程序员。

validation有了这个插件就再也不用这样去校验参数了,可以让我们在项目中不用浪费很多时间在参数校验这里,从而更专注于业务逻辑

正文

首先引入依赖

?
1
2
3
4
<dependency>
 <groupid>org.springframework.boot</groupid>
 <artifactid>spring-boot-starter-web</artifactid>
</dependency>

这里创建一个用户的dto对象

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
@data
@apimodel("用户-表单对象")
public class sportsusercreatform{
 
 @apimodelproperty(value="用户唯一标识",example = "0")
 @notnull(groups = {update.class})
 private long id;
 
 @apimodelproperty(value = "所属机构唯一标识(冗余字段)", example = "0")
 private long organizationid;
 
 @apimodelproperty("登录用户名")
 @notblank(message = "用户名不能为空")
 @length(max = 10, message = "用户名最长为10位")
 private string loginname;
 
 @apimodelproperty("密码")
 private string password;
 
 @apimodelproperty("手机号")
 private string phone;
 
 @apimodelproperty("邮箱")
 private string email;
 
 @apimodelproperty("性别( 'male', 'female' )")
 @notnull(message = "用户性别不能为空")
 private sportsuserenumgender gander;
 
 @apimodelproperty(value = "出生日期-13位时间戳",example = "0")
 private long birthday;
 
 @apimodelproperty("身份证号")
 private string idnumber;
 
 @apimodelproperty("用户昵称")
 private string nickname;
 
}

在controller层添加@validated注解,添加注解之后spring就会逐个校验dto中加了校验注解的字段,完全通过才可以进入业务处理,否则就会抛出methodargumentnotvalidexception异常

?
1
2
3
4
5
6
@postmapping("user/add")
@requiresauthentication
@apioperation("添加用户")
public sportsuser adduser(@validated @requestbody sportsusercreatform user) throws exception{
return userbiz.adduser(user);
}

一般项目来说抛出异常都会有约定好的json格式返回错误码和错误信息,如果不处理就无法按照约定格式返回。这里我们可以通过声明全局异常处理类来拦截异常并将异常处理成前端能操作的json数据。(这里只需要关注methodargumentnotvalidexception异常)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@slf4j
@order(ordered.highest_precedence)
@restcontrolleradvice
public class globalexceptionadvice {
 
 @exceptionhandler(methodargumentnotvalidexception.class)
 @responsebody
 public responseentity<object> handlebeanvalidation(httpservletresponse res, methodargumentnotvalidexception e) throws exception{
 res.setstatus(httpstatus.ok.value());
 list<objecterror> errors = e.getbindingresult().getallerrors();
 objecterror error = errors.get(0);// 如果有多个异常,这里只取第一个异常。没有必要把所有异常都抛出(错就是错,第一个校验都没通过,自然也轮不到第二个校验。)
 string json = jsonutils.obj2json(error);
 map map = jsonutils.json2map(json);
 okmessage result = new okmessage();
 result.setmsg("请求参数错误"e.getbindingresult().getfielderror().getdefaultmessage() + "]");
 result.setcode("param-000001");
 return new responseentity<>(result, httpstatus.ok);
 }
}

分组校验

有的人就要发问了,"啊,你这校验不行啊,我在添加的时候id是自动生成的不需要校验,编辑的时候就需要校验id了,我是不是要建两个一模一样的dto,这样岂不是显得我很憨?!这不是增加无用代码吗?差评!"

 其实不然,在此我们可以用到 groups 属性来解决此场景下的问题。

声明分组

注意:在声明分组的时候尽量继承 extend javax.validation.groups.default。 否则,在你声明@validated(update.class)的时候,就会出现你在默认没添加groups = {}的时候的校验组@email(message = "邮箱格式不对")不会自动校验,因为默认的校验组是groups = {default.class}。

?
1
2
3
4
5
6
7
8
import javax.validation.groups.default;
 
/**
 * 数据新增分组
 */
public interface create extends default {
 
}
?
1
2
3
4
5
6
7
8
import javax.validation.groups.default;
 
/**
 * 数据更新分组
 */
public interface update extends default {
 
}

Spring boot validation校验方法实例

修改controller中的@validated注解,声明校验分组(下面用的是create.class所以并不会校验id)

?
1
2
3
4
5
6
@postmapping("user/add")
@requiresauthentication
@apioperation("添加用户")
public sportsuser adduser(@validated(create.class) @requestbody sportsusercreatform user) throws exception{
return userbiz.adduser(user);
}

下面附上注解说明

验证注解 验证的数据类型 说明
@assertfalse boolean,boolean 验证注解的元素值是false
@asserttrue boolean,boolean 验证注解的元素值是true
@notnull 任意类型 验证注解的元素值不是null
@null 任意类型 验证注解的元素值是null
@min(value=值) bigdecimal,biginteger, byte,short, int, long,等任何number或charsequence(存储的是数字)子类型 验证注解的元素值大于等于@min指定的value值
@max(value=值) 和@min要求一样 验证注解的元素值小于等于@max指定的value值
@decimalmin(value=值) 和@min要求一样 验证注解的元素值大于等于@ decimalmin指定的value值
@decimalmax(value=值) 和@min要求一样 验证注解的元素值小于等于@ decimalmax指定的value值
@digits(integer=整数位数, fraction=小数位数) 和@min要求一样 验证注解的元素值的整数位数和小数位数上限
@size(min=下限, max=上限) 字符串、collection、map、数组等 验证注解的元素值的在min和max(包含)指定区间之内,如字符长度、集合大小
@past java.util.date,java.util.calendar;joda time类库的日期类型 验证注解的元素值(日期类型)比当前时间早
@future 与@past要求一样 验证注解的元素值(日期类型)比当前时间晚
@notblank charsequence子类型 验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@notempty,@notblank只应用于字符串且在比较时会去除字符串的首位空格
@length(min=下限, max=上限) charsequence子类型 验证注解的元素值长度在min和max区间内
@notempty charsequence子类型、collection、map、数组 验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0)
@range(min=最小值, max=最大值) bigdecimal,biginteger,charsequence, byte, short, int, long等原子类型和包装类型 验证注解的元素值在最小值和最大值之间
@email(regexp=正则表达式,flag=标志的模式) charsequence子类型(如string) 验证注解的元素值是email,也可以通过regexp和flag指定自定义的email格式
@pattern(regexp=正则表达式,flag=标志的模式) string,任何charsequence的子类型 验证注解的元素值与指定的正则表达式匹配
@valid 任何非原子类型 指定递归验证关联的对象如用户对象中有个地址对象属性,如果想在验证用户对象时一起验证地址对象的话,在地址对象上加@valid注解即可

此处只列出hibernate validator提供的大部分验证约束注解,请参考hibernate validator官方文档了解其他验证约束注解和进行自定义的验证约束注解定义。

?
1
2
3
4
常用的几个:
1.@notnull:不能为null,但可以为empty(""," ","   ")
2.@notempty:不能为null,而且长度必须大于0 (" ","  ")
3.@notblank:只能作用在string上,不能为null,而且调用trim()后,长度必须大于0("test")    即:必须有实际字符

总结

到此这篇关于spring boot validation校验的文章就介绍到这了,更多相关springboot validation校验内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/qq_25533359/article/details/113866279

延伸 · 阅读

精彩推荐
  • Java教程源码级深挖AQS队列同步器

    源码级深挖AQS队列同步器

    在java中提供了两类锁的实现,一种是在jvm层级上实现的synchrinized隐式锁,另一类是jdk在代码层级实现的,juc包下的Lock显示锁,而提到Lock就不得不提一下它...

    码农参上7712021-04-13
  • Java教程详解如何将JAR包发布到Maven中央仓库

    详解如何将JAR包发布到Maven中央仓库

    这篇文章主要介绍了详解如何将JAR包发布到Maven中央仓库,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    Fundebug4972021-07-02
  • Java教程Java中json与javaBean几种互转的讲解

    Java中json与javaBean几种互转的讲解

    今天小编就为大家分享一篇关于Java中json与javaBean几种互转的讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小...

    8blues3842021-07-21
  • Java教程详解path和classpath的区别

    详解path和classpath的区别

    这篇文章主要介绍了详解path和classpath的区别的相关资料,需要的朋友可以参考下...

    hejjunlin5392020-11-22
  • Java教程浅谈Java三目运算

    浅谈Java三目运算

    本文给大家主要介绍的是java中三目运算的详细介绍,并附上2个示例,希望对大家理解三目运算能够有所帮助。 ...

    hebedich2532019-12-13
  • Java教程javaweb设计中filter粗粒度权限控制代码示例

    javaweb设计中filter粗粒度权限控制代码示例

    这篇文章主要介绍了javaweb设计中filter粗粒度权限控制代码示例,小编觉得还是挺不错的,需要的朋友可以参考。...

    bluzelee20119202021-01-18
  • Java教程Java 选择、冒泡排序、折半查找(实例讲解)

    Java 选择、冒泡排序、折半查找(实例讲解)

    下面小编就为大家带来一篇Java 选择、冒泡排序、折半查找(实例讲解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看...

    Java教程网2202020-12-09
  • Java教程SpringBoot实现excel文件生成和下载

    SpringBoot实现excel文件生成和下载

    这篇文章主要为大家详细介绍了SpringBoot实现excel文件生成和下载,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    shengshenglalala5582021-08-06