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

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

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

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

1.引出问题

下面是12306车次查询API:

注:上面的请求是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(参数实体)。

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

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

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

3. 具体实现

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

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

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

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

本文转自 secondriver 51CTO博客,原文链接:http://blog.51cto.com/aiilive/1661317,如需转载请自行联系原作者

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

  1. Java Bean Validation 最佳实践

    <h1 class="postTitle"><a id="cb_post_title_url" class="postTitle2& ...

  2. Java Bean Validation 详解

    前言 最近维护一个老项目,项目使用最原始的Servlet,项目中充斥着各种类似判空的简单校验,为了减少重复代码,因此需要手动引入 Java 的 Bean Validation. Java Bean V ...

  3. 基于java+Socket+sqlserver的油液远程监控系统软件设计

    基于java+Socket+sqlserver的油液远程监控系统软件设计 1.启动被监控端,打开指定的UDP端口号.用于读取命令. 2.被监控端读取命令(命令格式为ordername:port)ord ...

  4. java象棋游戏用户特点_基于Java Swing的《中国象棋》游戏的设计与实现

    60 开发经验 3基金项目: 江西省自然科学基金资助项目(编号: 0411046); 江西省高性能计算技术重点实验室资助基金项目(No. JXHC20052003) ). 基于 Java Swing ...

  5. 基于JAVA线上远程教学及自主学平台的设计与实现计算机毕业设计源码+系统+mysql数据库+lw文档+部署

    基于JAVA线上远程教学及自主学平台的设计与实现计算机毕业设计源码+系统+mysql数据库+lw文档+部署 基于JAVA线上远程教学及自主学平台的设计与实现计算机毕业设计源码+系统+mysql数据库+ ...

  6. @Valid 注解详解 Java Bean Validation的前世今生

    Spring @Valid 注解 校验实体属性 1 @Valid 介绍 1.1 前言 1.2 Bean Validation 1.3 关于validation包 1.3 关于Spring Hibern ...

  7. 基于Java、Kafka、ElasticSearch的搜索框架的设计与实现

    Jkes是一个基于Java.Kafka.ElasticSearch的搜索框架.Jkes提供了注解驱动的JPA风格的对象/文档映射,使用rest api用于文档搜索. 项目主页:https://gith ...

  8. (附源码)springboot+mysql+基于Java的学生请销假审批管理系统的设计与实现 毕业设计130939

    摘 要 科技进步的飞速发展引起人们日常生活的巨大变化,电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用.信息时代的到来已成为不可阻挡的时尚潮流,人类发展的历史正进入一个新时代. ...

  9. 基于Java的学生请销假审批管理系统的设计与实现毕业设计源码130939

    摘  要 科技进步的飞速发展引起人们日常生活的巨大变化,电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用.信息时代的到来已成为不可阻挡的时尚潮流,人类发展的历史正进入一个新时代 ...

最新文章

  1. 论文Fast and accurate short read alignment with Burrows-Wheeler transform
  2. CMU最新《深度学习》2022春季课程,Ruslan Salakhutdinov教授主讲
  3. jpa多表关联查询_JPA【关联查询篇】
  4. SQL Server中的几个方法和Transact SQL 常用语句以及函数[个人推荐]
  5. Oracle常用系统表
  6. crypto-js RC4和hash_hmac运用
  7. opencv立方体的画法_用opengl立方体的画法
  8. 微信小程序初始化 operateWXData:fail invalid scope
  9. LSGO软件技术团队对外技术交流
  10. 【转】UML基础: 第 2 部分 - 对象图 (Object Diagram)
  11. linux下dns劫持C语言实现,Linux下实现劫持系统调用的总结(上)--代码及实现
  12. 28 POSIX Threads
  13. 关于Oracle10g归档参数的研究
  14. revit 转换ifc_revit怎么导ifc?如何使用FME在Revit中导出IFC
  15. shell 中 if[X$1 = X];then 什么意思
  16. SQL SERVER学习记录
  17. 成为oracle白金会员,华为成为Linux基金会白金会员
  18. 调频 调幅 与 通信
  19. H3C无线控制器双链路备份配置
  20. 省赛题目(4月23日)

热门文章

  1. fzyzojP2984 -- 序列变换问题
  2. shiro filter
  3. c#委托把方法当成参数
  4. 【分享】免费建立自己的站点
  5. hdu 1285 确定比赛名次
  6. IIS错误信息--另一个程序正在使用此文件,进程无法访问!
  7. 安装McAfee 8.7i 提示错误1920怎么办?
  8. 用DELPHI中Canvas特性开发图形软件
  9. linux内核阅读感悟,读Kernel感悟-Linux内核启动-从hello world说起
  10. 使用CXF实现Webservice的服务接口提供以及相关的客户端实现