苦B的程序猿道路数据验证
发生了什么
再一次苦B程序猿和苦C程序猿结对话发生编程周期
此代码:
public void deleteAllExtendAclsFromContent(String contentId) throwsContentAclServiceException {
// 參数验证
if (StringUtils.isBlank(contentId)) {
logger.warn("參数异常,内容唯一标识为空");
throw new ContentAclServiceException("參数异常。内容唯一标识为空");
}
// 检查内容合法性
contentAclService.checkContentId(contentId);
contentAclCoreService.deleteAllExtendAclsFromContent(contentId);
}
苦C程序猿:会什么你的每一个方法都要去检查一下參数是不是null,參数是不是指定的几种可选数据?
苦B程序猿:由于假设我不检查,后面的操作将会是对一个错误的对象进行,会影响程序的正确运行。
苦C程序猿:可是这种方法应该仅仅关注自己的业务逻辑而不应该做一些与业务无关的參数的正确性推断,否则这种方法可能10行中有7行都是做參数合法性验证,真正的业务可能仅仅有3行,你不认为这会非常怪异吗?
苦B程序猿:那我有什么办法。我的程序跑不下去了。測试来找我的麻烦了!
苦C程序猿:我看你的每一个方法都要对參数做合法性检查,那能否够将这样一个行为提取出来使全部的方法在被调用之前让一个类去做參数的合法性检查,我们仅仅要给參数一个说明比方这样
public void deleteAllExtendAclsFromContent(@NotEmpty(message="參数异常,内容唯一标识为空")
String contentId) throws ContentAclServiceException {
// 检查内容合法性
contentAclService.checkContentId(contentId);
contentAclCoreService.deleteAllExtendAclsFromContent(contentId);
}
苦B程序猿:嗯,这样看起来非常不错,我们能够利用spring的aop做个拦截,在全部的方法被调用前先让一个拦截器来检查全部的參数是否合法。
苦C程序猿:对,我们就这样干。

没多久时序图片就出来了。
.
.
.
半天后。两个人仅仅有一个想法。那就是太苦B了,这是一整个体系两个人一天怎么做的完?在项目的时间进度压力下两人仅仅有放弃(看来非常多情况下不是程序猿不想把事情做好。时间、时间、还是时间),于是程序又回到了刚開始,而且他们不得不为这一次冒险所耽搁的时间去自己加班完毕工作。
这种事情发生的多了大家就再也不会想在项目里使用什么优美的方式或好的模式来编写与设计代码了,而是以完毕功能为目地的编码。
回想上面的对话我们发现
Ø 苦B程序猿的做法,是为了防止程序出现异常而对输入參数为了检查。
Ø 苦C程序猿的想法,是让这样的检查工作不必分散到各业务方法中。
两个程序猿都是想把程序做的更健壮、业务更清晰、职责更分明。可是因为客观的原因他们的努力失败了。
神的出现
继续上面,此时的苦C程序猿依旧没有放弃。他利用项目的空暇时间继续研究,他觉得这样的需求应该不仅仅他一个人有。世界上还有那么多的苦X程序猿,可能早就有人想到了这个需求,或许早就有人已经完毕了这个工作,苦C程序猿突然想起了spring的mvc中好像能够验证參数的正确性,于是他求助了万能的google大神,最终被他找了解决问题的究极方案。
当当当“JSR303”闪亮登场。http://jcp.org/en/jsr/detail?id=303
这个规范当前较好的实现是Hibernate Validator,http://www.hibernate.org/subprojects/validator.html而且也可较方便的与spring集成。
此时的苦C程序猿感觉到浑身充满了力量。他大叫一声“JSR303赐予我力量吧!Google,live
for ever”。
从此苦C程序猿在开发这条苦B的不归路上走的更坚实了,由于他又多了一把称手的神器—“JSR303”。
苦B程序猿和苦C程序猿皈依了我神终于升华为苦A程序猿
网上有这样一个样例https://github.com/ghillert/spring-hibernate-validator-sample,这里面就是讲述怎样使用JSR303来验证方法參数的。这里面须要在spring中做例如以下配置
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>
<bean class="org.springframework.validation.beanvalidation.MethodValidationPostProcessor"/>
关键就在MethodValidationPostProcessor这个类。它的作用就是给全部的标记了要做验证的接口加入一个org.springframework.validation.beanvalidation.MethodValidationInterceptor拦截器。这个拦截器会负责验证你所要验证的參数。
但这个拦截器会抛出一个org.hibernate.validator.method.MethodConstraintViolationException.MethodConstraintViolationException异常。对于有些人来说或许他们并不希望得到这种异常。可能是由于这个异常长的太怪异,也可能是其他的原因,总之就是不希望用这个,他们希望自已来控制验证出错后的处理方式。谢天谢地这一切都是开源的(感谢天。感谢地,感谢Spring……熟悉的旋律出如今耳边)。那么分析MethodValidationPostProcessor与MethodValidationInterceptor代码后我们能够非常easy的做到这一点,聪明的程序猿们应该非常快就能够明确了。
苦C程序猿以最快的速度将这个消息告诉了苦B程序猿,苦B程序猿得到这个消息后第一直觉就是要尽快将这个成果分享到整个团队中,于是不久后整个团队的成员都皈依了我神(JSR303)终于升华为了苦A程序猿(为什么还是苦A程序猿?因为有新的麻烦将继续出现,我勒个去……)。
版权声明:本文博客原创文章。博客,未经同意,不得转载。
苦B的程序猿道路数据验证的更多相关文章
- 苦B程序员的数据验证之路
发生了什么事 在一次苦B程序员和苦C程序员的结对编程中发生的一段对话 代码是这样的: public void deleteAllExtendAclsFromContent(String content ...
- 程序猿的还有一出路:大数据project师
非常多年前我非常郁闷地写了一篇博客<程序猿的出路在哪里?>,之所以郁闷.我记得是看了中国男足的比赛,不由自主对照自已苦逼的程序猿生涯,以前对中国软件的感情有如对中国男足,绝望到没有不论什么 ...
- Java 设置Excel数据验证
数据验证是Excel 2013版本中,数据功能组下面的一个功能,在Excel2013之前的版本,包含Excel2010 Excel2007称为数据有效性.通过在excel表格中设置数据验证可有效规范数 ...
- 程序猿的道路~~(How to be a programmer?)
程序猿的道路其实很简单,主要就是三条: Learn (学习), Practice(练习), Summary(总结) 推荐给新手程序猿两篇文章: 给程序员新手的一些建议 程序员技术练级攻略 当然了,整个 ...
- EFCore Lazy Loading + Inheritance = 干净的数据表 (二) 【献给处女座的DB First程序猿】
前言 本篇是上一篇EFCore Lazy Loading + Inheritance = 干净的数据表 (一) [献给处女座的DB First程序猿] 前菜 的续篇.这一篇才是真的为处女座的DB Fi ...
- 毕业生、程序猿转岗该如何选择Java、大数据和VR?
许久不见的朋友请我吃饭,期间给我介绍他一个弟弟,说明年要毕业了,还不知道找啥工作,说有培训机构让他学VR.大数据什么的,不知道前景咋样,想咨询一下我.相信很多朋友面临毕业,都不知道该从事哪个行业,自己 ...
- 毕业生、程序猿转岗该如何选择Java、大数据和VR?答案在这里!
许久不见的朋友请我吃饭,期间给我介绍他一个弟弟,说明年要毕业了,还不知道找啥工作,说有培训机构让他学VR.大数据什么的,不知道前景咋样,想咨询一下我.相信很多朋友面临毕业,都不知道该从事哪个行业,自己 ...
- 1 开发一个注重性能的JDBC应用程序不是一件容易的事. 当你的代码运行很慢的时候JDBC驱动程序并不会抛出异常告诉你。 本系列的性能提示将为改善JDBC应用程序的性能介绍一些基本的指导原则,这其中的原则已经被许多现有的JDBC应用程序编译运行并验证过。 这些指导原则包括: 正确的使用数据库MetaData方法 只获取需要的数据 选用最佳性能的功能 管理连
1 开发一个注重性能的JDBC应用程序不是一件容易的事. 当你的代码运行很慢的时候JDBC驱动程序并不会抛出异常告诉你. 本系列的性能提示将为改善JDBC应用程序的性能介绍一些基本的指导原则,这其中的 ...
- 从此走上一条iOS程序猿不归路。。。
新的城市,新的生活!前不久刚刚结束了苦逼的面试找工作之旅,期间也小有收货,如今正处年底工作闲暇之余,将前一阵子陆陆续续的总结整理了一下,本人菜鸟程序猿一只,水平有限,本文总结的知识不算深入,比较浅显, ...
随机推荐
- android中用get和post方式向服务器提交请求
通过get和post方式向服务器发送请求首先说一下get和post的区别get请求方式是将提交的参数拼接在url地址后面,例如http://www.baidu.com/index.jsp?num=23 ...
- AS3.0下去除flash右键菜单
这两天工作中遇到一个问题,就是网页中内嵌的flash小游戏的用户体验,当鼠标在flash上点击右键时,出现的右键菜单中会有播放,停止等选项,虽然不会造成什么漏洞,但是体验非常差.在寻找解决方案的时候, ...
- POJ 3181 Dollar Dayz 简单DP
这DP虽然简单 但是思考一下还是挺好的 题意是 1,2,3,4....k 用加法凑成N 每个数可取不限个数 令dp[i][j] 表示前i种数凑成j的方案数 然后dp[i][j] = dp[i - 1] ...
- Cocos2d-x Layout简单使用
1. Text* alert = Text::create("Layout", "fonts/Marker Felt.ttf", 30 ); alert-> ...
- Windows Phone开发(25):启动器与选择器之WebBrowserTask
原文:Windows Phone开发(25):启动器与选择器之WebBrowserTask 从名字上就看出来,这个家伙就是打开浏览并浏览到指定页面. 它有两个用途完全一样的属性:Uri属性是Syste ...
- usb host鼠标不能使用原因
linux kernel 3.4.5的板子插入USB鼠标,出现例如以下错误LOG: [ 191.177508] Plug in USB Port2 [ 191.363516] usb 1-1: n ...
- Google 开源项目的风格指南
谷歌C++代码风格指南.农业所需的代码.更难得的是不FQ,决定性的最爱!! . http://zh-google-styleguide.readthedocs.org/en/latest/google ...
- 基于JAVA WEB技术旅游服务网站系统设计与实现网上程序代写
基于JAVA WEB技术旅游服务网站系统设计与实现网上程序代写 专业程序代写服务(QQ:928900200) 随着社会的进步.服务行业的服务水平不断发展与提高,宾馆.酒店.旅游等服务行业的信息量和工作 ...
- elasticsearch中国字(mmseg)——手动添加字典
elasticsearch中国文字本身并不是一个理想的插件效果.手动添加字典可以补偿在一定程度上. 后发现了几个实验,mmseg分段机制采用正向最长匹配算法.例如,抵抗"小时报"这 ...
- Socket规划(1)
socket定义 于Linux网络编程是通过socket进行的. 人们常说的socket是一种特殊的I/O接口,他也是一个文件描写叙述符.socket是一种经常使用的进程之间通信机制,通过它不仅能实现 ...