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

摘自Hibernate Validator文档:

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

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参数进行校验的设计思路“就告一段落,更多想法有待探索和实践。

时间: 2024-11-03 21:44:43

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

深入了解数据校验:Java Bean Validation 2.0(JSR380)

每篇一句 吾皇一日不退役,尔等都是臣子 相关阅读 [小家Java]深入了解数据校验(Bean Validation):基础类打点(ValidationProvider.ConstraintDescriptor.ConstraintValidator) 对Spring感兴趣可扫码加入wx群:`Java高工.架构师3群`(文末有二维码) 前言 前几篇文章在讲Spring的数据绑定的时候,多次提到过数据校验.可能有人认为数据校验模块并不是那么的重要,因为硬编码都可以做.若是这么想的话,那就大错特错了~

Java bean validation 规范与参考实现

1.Apache Bval 依赖包:validation-api-1.1.0.Final.jar org.apache.bval.bundle-1.1.1.jar bval-core-1.1.1.jar validator实现类:org.apache.bval.jsr.ApacheValidationProvider 2.Hibernate Validator 依赖包:validation-api-1.1.0.Final.jar hibernate-validator-5.3.0.Alpha1.

Java Bean Validation 最佳实践

参数校验是我们程序开发中必不可少的过程.用户在前端页面上填写表单时,前端js程序会校验参数的合法性,当数据到了后端,为了防止恶意操作,保持程序的健壮性,后端同样需要对数据进行校验.后端参数校验最简单的做法是直接在业务方法里面进行判断,当判断成功之后再继续往下执行.但这样带给我们的是代码的耦合,冗余.当我们多个地方需要校验时,我们就需要在每一个地方调用校验程序,导致代码很冗余,且不美观. 那么如何优雅的对参数进行校验呢?JSR303就是为了解决这个问题出现的,本篇文章主要是介绍 JSR303,Hi

基于Java/Swing技术的KTV包间管理系统的设计与实现

获取项目源文件,技术交流与指导联系Q:1225467431 摘 要 KTV包房管理系统的设计必须考虑众多因素及其相互之间的关联,因此如何选择有效的设计模式是非常重要的.在本系统中,基于Java/Swing技术设计并实现了客户端. 它由模型-视图-控制器(MVC)模式设计而成. 本项目基于Java Swing的窗体布局技术进行软件的窗体布局. 本KTV管理系统是一个功能强大的.可靠的.方便的平台处理KTV包房管理业务. 该系统不仅能提高KTV包房管理的工作效率,另一方面也为客人在预订时提供一种较为

Java参数验证Bean Validation 框架

1.为什么要做参数校验? 参数校验和业务逻辑代码分离,参数校验代码复用,统一参数校验方式.校验不太通过时统一异常描述. 2.bean validation规范 JSR303 规范(Bean Validation 规范)提供了对 Java EE 和 Java SE 中的 Java Bean 进行验证的方式.该规范主要使用注解的方式来实现对 Java Bean 的验证功能,并且这种方式会覆盖使用 XML 形式的验证描述符,从而使验证逻辑从业务代码中分离出来.JSR303注解如下: Hibernate

基于java spring框架开发部标1078视频监控平台精华文章索引

部标1078视频监控平台,是一个庞杂的工程,涵盖了多层协议,部标jt808,jt809,jt1078,苏标Adas协议等,多个平台功能标准,部标796标准,部标1077标准和苏标主动安全标准,视频方面的协议有RTSP, RTMP, RTP, 音视频编码有H.264, AAC,  726,711等,消化这些协议和功能标准就已经是需要一个较长的周期了,而构建一个视频平台的架构,也是比较复杂的,后端不仅有网关,还要有流媒体服务器,转发服务器,播放器,RTSP或RTMP服务器等多个服务器模块,需要的技术

Java SSH框架系列:用户登录模块的设计与实现思路

时间 2014-01-19 16:14:54  CSDN博客原文  http://blog.csdn.net/nupt123456789/article/details/18504615 1.简介 用户登录模块,指的是根据用户输入的用户名和密码,对用户的身份进行验证等.如果用户没有登录,用户就无法访问其他的一些jsp页面,甚至是action都不能访问. 二.简单设计及实现 本程序是基于Java的SSH框架进行的. 1.数据库设计 我们应该设计一个用户表,其Userinfo表,对应的SQL语句为(

在系统中使用Bean Validation验证参数

转自:http://www.importnew.com/18561.html 为什么要使用Bean Validation? 当我们实现某个接口时,都需要对入参数进行校验.例如下面的代码 1 2 3 4 5 public String queryValueByKey(String parmTemplateCode, String conditionName, String conditionKey, String resultName) {         checkNotNull(parmTem

开涛spring3(12.4) - 零配置 之 12.4 基于Java类定义Bean配置元数据

12.4  基于Java类定义Bean配置元数据 12.4.1  概述 基于Java类定义Bean配置元数据,其实就是通过Java类定义Spring配置元数据,且直接消除XML配置文件. 基于Java类定义Bean配置元数据中的@Configuration注解的类等价于XML配置文件,@Bean注解的方法等价于XML配置文件中的Bean定义. 基于Java类定义Bean配置元数据需要通过AnnotationConfigApplicationContext加载配置类及初始化容器,类似于XML配置文