专栏首页码农小胖哥的码农生涯让你的代码更加简练,springboot使用JSR303校验

让你的代码更加简练,springboot使用JSR303校验

痛点

相信不少人写过这样都代码,对方法入参进行了各种校验。上面还是比较少的校验。如果遇到什么邮箱、手机号更复杂,对格式也需要进行校验。可能洋洋洒洒几百行代码就过去了。这种代码其实跟业务流程没有太多关系,但是又不能不做。那么有没有一种方法可以避免呢。当然有!就是JSR-303(JSR是指向JCP(Java Community Process)提出新增一个标准化技术规范的正式请求,是Java界的一个重要标准)校验规范。

JSR-303

JSR-303 是 JAVA EE 6 中的一项子规范,叫做 Bean Validation,官方的参考实现是Hibernate Validator。需要注意的是此实现与 Hibernate ORM 没有任何关系。JSR 303 用于对 Java Bean 中的字段的值进行合法性验证。Spring MVC 3.x 开始支持 JSR-303,可以在控制器中对提交的数据进行JSR-303验证。 把验证交给框架,让我们更专注于业务 。常用的规则如下:

springboot中JSR的使用

默认springboot集成了 hibernate-validator,而且默认是生效的,可以直接使用。默认不支持基础类型的验证,必须配置拦截器MethodValidationPostProcessor,在Controller类上加 @Validated注解可以实现对方法参数的校验。而且默认只验证 controller 方法上的 validator 注解,而不会验证 controller 层以外的。所以,如果要在其他层使用 validator 验证的话,需要单独配置拦截器.

如果验证对象是java Bean,就更好操作了,我们下面走一个完整的springboot例子,

先构建一个需要校验的java Bean,通过JSR-303的校验注解进行对应的操作,如下

在springmvc接口中 像下面一样增加一个@Valid 注解就行了

这里可能你产生了疑问,如果校验失败我们怎么办?不知道你是否了解springboot 统一异常处理

(通过@ControllerAdvice 声明一个全局异常类)我们可以通过统一拦截处理校验异常把上面注解中的的message信息返回给前端。值得注意的是,如果你前台传入的参数不在body中,校验失败抛出BindException异常,如果接口方法的参数有@RequstBody 注解,即参数放在body中传输,会抛出MethodArgumentNotValidException 异常,分别加以处理即可。样例如下

如果上面的不满足需要,我们还可以对hibernate-validator 进行扩展,甚至可以实现fail-fast 机制(当有错误时剩下的都不再进行校验立即失败)。这个留给你自己探索发现。上面的可以应付大多数场景,而且如果配合lombok 神器 你的代码会更加清晰简练。

本文分享自微信公众号 - 码农小胖哥(Felordcn),作者:码农小胖哥

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-07-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 浅谈java响应式编程以及Reactor 3框架

    Reactor 3是一个围绕Reactive Streams规范构建的库,它在JVM上引入了响应式编程的一个范例。目前Spring5 引入的Webflux就是r...

    码农小胖哥
  • Java 响应式关系数据库连接了解一下

    响应式编程已经在 Java 编程领域出现很长一段时间了。具有高性能,事件驱动,充分利用计算资源,更加优雅的异步编程体验,同时它也提供了背压机制来防止系统过载。很...

    码农小胖哥
  • Java Web 面试中关于Spring MVC的必问题,不收藏血亏!

    Spring MVC 实现了一些明确而且相对低耦合的概念,可以让开发者很容易开发和测试他们的Web应用。这些概念有:

    码农小胖哥
  • 全球金融市场通用语言FIX API|深度解析

    随着金融市场电子交易趋势的逐步形成,FIX已经成为全球金融市场的通用语言之一,被交易者、交易平台甚至监管机构广泛应用。今天和大家一起聊一聊基于FIX协议而诞生的...

    BestSDK
  • 谱聚类概述

    磐创AI
  • JavaScript正则表达式下——相关方法

    http://www.cnblogs.com/dolphinX/p/3486136.html

    bear_fish
  • js判断浏览器信息

    本示例讲述了关于js获取各种浏览器信息,例如微信浏览器,qq内置浏览器,电脑火狐浏览器,qq浏览器等等

    仙士可
  • 想入门设计卷积神经网络?这是一份综合设计指南

    机器之心
  • 如何用PHP写个优雅的Mock框架

    由于工作中前后端开发工作分离的问题,现阶段后端功能怎在设计中,前端UI也正在调整中。好像项目也无法开始。于是为了满足提前开发,不用自己创造数据,就尝试使用moc...

    猿哥
  • Cocopods| 使用自己的私有仓库时的一次报错记录

    查看本地的 cocoapods repos 有没有时,发现没有我们想要的类库:JWJFramework

    進无尽

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动