文档章节

基于Java Bean Validation对Request参数进行校验的设计思路

secondriver
 secondriver
发布于 2015/09/17 09:26
字数 1045
阅读 187
收藏 0


 摘自Hibernate Validator文档:


 数据校验是任何一个应用程序都会用到的功能,无论是显示层还是持久层. 通常,相同的校验逻辑会分散在各个层中, 这样,不仅浪费了时间还会导致重复代码的发生. 为了避免重复, 开发人员经常会把这些校验逻辑直接写在领域模型里面, 但是这样又把领域模型代码和校验代码混杂在了一起, 而这些校验逻辑更应该是描述领域模型的元数据.

 wKiom1V6fwCQfN-RAACyvw5fsaI471.jpg

     JSR 303 - Bean Validation (version 1.1)- 为实体验证定义了元数据模型和API. 默认的元数据模型是通过Annotations来描述的,但是也可以使用XML来重载或者扩展. Bean Validation API 并不局限于应用程序的某一层或者哪种编程模型, 例如,如图所示, Bean Validation 可以被用在任何一层, 或者是像类似Swing的富客户端程序中.


   wKioL1V6gLTAlJ-eAADWJPTcUH0246.jpg



    从上述描述和图示可以看到数据检验伴随整个系统的各个层面,专业的说数据校验属于面向方面的范畴。

    本文关注在Web开发中Http请求参数的数据校验。

   1.引出问题 

   下面是12306车次查询API:

   wKiom1V6ge2ijEdPAAGR0401SFQ806.jpg

    注:上面的请求是php的,暂且我们转为Servlet。

    请求有五个参数,在做查询的时候通常会做数据校验处理,这里涵盖了数据格式,数据有效性。比如date就要校验数据格式,tt就要校验数据有效性(通常车次类型是固定数目的类型编码,较少改动)。

  

    在Web开发中这样的请求参数校验是很多的,通常在前端对参数校验之后,后端仍然是需要再次严格的校验。那么对于这样的非业务代码就可以抽取出来,单独做数据校验,如果校验通过,则继续下一步业务处理,不通过则做相应的处理。

   

  2. 如何解决

     上面提到做单独的数据校验,这里的数据来自Http Request Parameter,校验则是我们要做的工作。校验有分为编写参数的校验规则和校验逻辑处理。

      如何编写校验规则,如何进行校验逻辑处理? 这里引入Java Bean Validation规范,其定义了元数据模型(可以认为是校验规则)和API(校验处理的接口)。 Java Bean Validation规范的实现有Hibernate-Validator,Oval等等,可以借助Bean Validation的实现解决方案来做这部分工作。剩下的就是Http Request Parameter到Bean的映射,这里我称该Bean为ParameterBean(参数实体)。

    整个解决方案的思路如下图:

   wKioL1V6khiCh4teAAEQhWc3-FE048.jpg

    


     流程说明:首先将请求参数进行包装,包装成参数Bean;然后通过Validation API的实现进行Bean校验得到校验结果;最后更加校验结果来进行下一步具体业务处理。

    实际开发中要首先定义好请求参数对应的参数Bean,对该Bean进行校验规则的编写,可以采用XML配置或者Annotation的方式。


 3. 具体实现

    具体实现则是熟悉和应用Bean Validation规范以及其对应的实现者,通过自定义扩展更多的校验规则。抽取出业务里关于请求参数的逻辑,交由Bean Validation模块单独处理。


  下图是一个简单的抽取请求参数校验的实现类结构图:

 wKioL1V6lBCBuFzOAAO4uekxWYY702.jpg


   

    在实际开发中可以更加需要进一步扩展,而正真依赖请求参数校验模块的接口则只有ParameterValidator这个接口,从而分离了请求参数校验,使其独立与业务逻辑。  

  

    至此关于“基于Java Bean Validation对Request参数进行校验的设计思路“就告一段落,更多想法有待探索和实践。


本文出自 “野马红尘” 博客,请务必保留此出处http://aiilive.blog.51cto.com/1925756/1661317

© 著作权归作者所有

secondriver
粉丝 10
博文 229
码字总数 233821
作品 0
广州
程序员
私信 提问
JSR303 - Bean Validation 介绍及最佳实践

关于 Bean Validation 在任何时候,当你要处理一个应用程序的业务逻辑,数据校验是你必须要考虑和面对的事情。应用程序必须通过某种手段来确保输入进来的数据从语义上来讲是正确的。在通常的...

heroShane
2014/02/26
173
0
JSR 303 - Bean Validation 介绍及最佳实践

关于 Bean Validation 在任何时候,当你要处理一个应用程序的业务逻辑,数据校验是你必须要考虑和面对的事情。应用程序必须通过某种手段来确保输入进来的数据从语义上来讲是正确的。在通常的...

阿莱倪士
2013/12/17
186
0
spring MVC使用及新特性说明

一、 spring MVC使用简述 配置部分: jar包和依赖jar包 前端控制器配置(web.xml): load-on-startup:表示启动容器时初始化该Servlet; url-pattern:表示哪些请求交给Spring Web MVC处理, ...

clark911
2016/08/02
85
0
Bean Validation 介绍及最佳实践

关于 Bean Validation 在任何时候,当你要处理一个应用程序的业务逻辑,数据校验是你必须要考虑和面对的事情。 应用程序必须通过某种手段来确保输入进来的数据从语义上来讲是正确的。在通常的...

芥末无疆sss
2018/05/08
0
0
JSR 303 - Bean Validation 介绍及最佳实践

JSR 303 – Bean Validation 是一个数据验证的规范,2009 年 11 月确定最终方案。2009 年 12 月 Java EE 6 发布,Bean Validation 作为一个重要特性被包含其中。本文将对 Bean Validation 的...

IBMdW
2011/05/25
4K
1

没有更多内容

加载失败,请刷新页面

加载更多

PostgreSQL 11.3 locking

rudi
51分钟前
5
0
Mybatis Plus sql注入器

一、继承AbstractMethod /** * @author beth * @data 2019-10-23 20:39 */public class DeleteAllMethod extends AbstractMethod { @Override public MappedStatement injectMap......

一个yuanbeth
今天
10
1
一次写shell脚本的经历记录——特殊字符惹的祸

本文首发于微信公众号“我的小碗汤”,扫码文末二维码即可关注,欢迎一起交流! redis在容器化的过程中,涉及到纵向扩pod实例cpu、内存以及redis实例的maxmemory值,statefulset管理的pod需要...

码农实战
今天
4
0
为什么阿里巴巴Java开发手册中不建议在循环体中使用+进行字符串拼接?

之前在阅读《阿里巴巴Java开发手册》时,发现有一条是关于循环体中字符串拼接的建议,具体内容如下: 那么我们首先来用例子来看看在循环体中用 + 或者用 StringBuilder 进行字符串拼接的效率...

武培轩
今天
8
0
队列-链式(c/c++实现)

队列是在线性表功能稍作修改形成的,在生活中排队是不能插队的吧,先排队先得到对待,慢来得排在最后面,这样来就形成了”先进先出“的队列。作用就是通过伟大的程序员来实现算法解决现实生活...

白客C
今天
80
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部