苦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程序猿不归路。。。
新的城市,新的生活!前不久刚刚结束了苦逼的面试找工作之旅,期间也小有收货,如今正处年底工作闲暇之余,将前一阵子陆陆续续的总结整理了一下,本人菜鸟程序猿一只,水平有限,本文总结的知识不算深入,比较浅显, ...
随机推荐
- ocx控件手动修改clsid的方法
替换掉工程的两个地方:IDL文件和CTRL文件. IMPLEMENT_OLECREATE_EX(CMultiwndCtrl, "MULTIWND.MultiwndCtrl.1", ...
- error C2504: “CActiveXDocControl”: 基类没有定义
这样的错误,通常,第一个文件失败: 1.相互头包括 2.头文件秩序 此错误是编译错误,和"inclued头文件"有关 问题描写叙述 有三个头文件AgentSDK.h.AA.h.BB ...
- Cocos2d-x 3.2 大富翁游戏项目开发-第七部分 获取角色路径_1
以下是一些设计略显繁琐,有必要清除思维. 下一个主要的成就,当我们点击Gobutton后,得到一个随机数骰子,是走了几步,它是基于以下步骤行走路径的数目,然后移动位置的基于角色的路径. 流程如图普遍认 ...
- 玩转web之ajax(一)---使用表单的serialize()方法中文乱码解决
有时候我们需要使用ajax提交去提交form的值,这样就需要使用serialize()去获取form的值,但这样获取的值如果有中文,会乱码,原因和解决方法如下: 原因:.serialize()自动调用 ...
- Android TextView里直接显示图片的三种方法
方法一:重写TextView的onDraw方法,也挺直观就是不太好控制显示完图片后再显示字体所占空间的位置关系.一般假设字体是在图片上重叠的推荐这样写.时间关系,这个不付源代码了. 方法二:利用Tex ...
- hdu 2391 Filthy Rich
单纯dp 水一 处理时间点,第一行和第一列特殊处理: 其余的w[i][j]=show(w[i-1][j-1],w[i-1][j],w[i][j-1]); <span style="fo ...
- strcpy_s与strcpy对照
strcpy_s和strcpy()函数功能几乎相同.strcpy函数.就象gets函数一样,它没有方法来保证有效的缓冲区尺寸,所以它仅仅能假定缓冲足够大来容纳要拷贝的字符串.在程序执行时,这将导致不可 ...
- 【原创】leetCodeOj ---Convert Sorted List to Binary Search Tree 解题报告
原题地址: https://oj.leetcode.com/problems/convert-sorted-list-to-binary-search-tree/ 题目内容: Given a sing ...
- hive RegexSerDe View
EXTERNALkeyword它允许用户创建一个外部表.在表中的同时施工指定的路径中的实际数据(LOCATION).Hive 创建内部表时.会将数据移动到数据仓库指向的路径:若创建外部表,仅记录数据所 ...
- 安装Microsoft .NET Framework 3.5 Service Pack 1回报1603错
server升级了一下系统补丁(360安装),所有发现.net无法打开网站,提示" 因为无法创建应用程序域,因此未能运行请求.错误: 0x80070002 系统找不到指定的文件. " ...