发生了什么

再一次苦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 Validatorhttp://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的程序猿道路数据验证的更多相关文章

  1. 苦B程序员的数据验证之路

    发生了什么事 在一次苦B程序员和苦C程序员的结对编程中发生的一段对话 代码是这样的: public void deleteAllExtendAclsFromContent(String content ...

  2. 程序猿的还有一出路:大数据project师

    非常多年前我非常郁闷地写了一篇博客<程序猿的出路在哪里?>,之所以郁闷.我记得是看了中国男足的比赛,不由自主对照自已苦逼的程序猿生涯,以前对中国软件的感情有如对中国男足,绝望到没有不论什么 ...

  3. Java 设置Excel数据验证

    数据验证是Excel 2013版本中,数据功能组下面的一个功能,在Excel2013之前的版本,包含Excel2010 Excel2007称为数据有效性.通过在excel表格中设置数据验证可有效规范数 ...

  4. 程序猿的道路~~(How to be a programmer?)

    程序猿的道路其实很简单,主要就是三条: Learn (学习), Practice(练习), Summary(总结) 推荐给新手程序猿两篇文章: 给程序员新手的一些建议 程序员技术练级攻略 当然了,整个 ...

  5. EFCore Lazy Loading + Inheritance = 干净的数据表 (二) 【献给处女座的DB First程序猿】

    前言 本篇是上一篇EFCore Lazy Loading + Inheritance = 干净的数据表 (一) [献给处女座的DB First程序猿] 前菜 的续篇.这一篇才是真的为处女座的DB Fi ...

  6. 毕业生、程序猿转岗该如何选择Java、大数据和VR?

    许久不见的朋友请我吃饭,期间给我介绍他一个弟弟,说明年要毕业了,还不知道找啥工作,说有培训机构让他学VR.大数据什么的,不知道前景咋样,想咨询一下我.相信很多朋友面临毕业,都不知道该从事哪个行业,自己 ...

  7. 毕业生、程序猿转岗该如何选择Java、大数据和VR?答案在这里!

    许久不见的朋友请我吃饭,期间给我介绍他一个弟弟,说明年要毕业了,还不知道找啥工作,说有培训机构让他学VR.大数据什么的,不知道前景咋样,想咨询一下我.相信很多朋友面临毕业,都不知道该从事哪个行业,自己 ...

  8. 1   开发一个注重性能的JDBC应用程序不是一件容易的事. 当你的代码运行很慢的时候JDBC驱动程序并不会抛出异常告诉你。   本系列的性能提示将为改善JDBC应用程序的性能介绍一些基本的指导原则,这其中的原则已经被许多现有的JDBC应用程序编译运行并验证过。 这些指导原则包括:    正确的使用数据库MetaData方法    只获取需要的数据    选用最佳性能的功能    管理连

    1 开发一个注重性能的JDBC应用程序不是一件容易的事. 当你的代码运行很慢的时候JDBC驱动程序并不会抛出异常告诉你. 本系列的性能提示将为改善JDBC应用程序的性能介绍一些基本的指导原则,这其中的 ...

  9. 从此走上一条iOS程序猿不归路。。。

    新的城市,新的生活!前不久刚刚结束了苦逼的面试找工作之旅,期间也小有收货,如今正处年底工作闲暇之余,将前一阵子陆陆续续的总结整理了一下,本人菜鸟程序猿一只,水平有限,本文总结的知识不算深入,比较浅显, ...

随机推荐

  1. Cordova CLI源码分析(三)——初始化

    本部分主要涉及以下三个文件 1 cli.js 2 cordova.js 3 events.js 通过前一篇package.json的分析,可以知道,当命令行执行cordova相关命令时,首先调用mai ...

  2. BEGINNING SHAREPOINT&#174; 2013 DEVELOPMENT 第15章节--开发SP2013工作流应用程序 总结

    BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第15章节--开发SP2013工作流应用程序 总结         在SP2013中,工作流已经从SP Server中脱离 ...

  3. Linux如何查找大文件或目录总结及在全部目录中查找

    在Windows系统中,我们可以使用TreeSize工具查找一些大文件或文件夹,非常的方便高效,在Linux系统中,如何去搜索一些比较大的文件呢?下面我整理了一下在Linux系统中如何查找大文件或文件 ...

  4. oracle数据库恢复与备份

    一.oracle数据库恢复 1.恢复刚才删除的一条数据 delete from emp e where e.empname='SMITH' select * from flashback_transa ...

  5. 【剑指offer】面试题26:复制的复杂链条

    def copyRandomList(self, head): if None == head: return None phead = head while phead: pnext = phead ...

  6. 什么是 CGI,什么是 IIS,什么是VPS

    该公司来到天.我们所从事的事情在网站上.这对我来说确实是一个很大的挑战.个人一直从事Android,对于web而一个开发网站server知识的几乎为零.在这里应该说,现在我只是有一个技术人员,昨天相遇 ...

  7. Java EE (2) -- Java EE 6 Enterprise JavaBeans Developer Certified Expert(1z0-895)

    Introduction to Java EE Gain an understanding of the Java Platform, Enterprise Edition (Java EE) Exa ...

  8. LCA 学习算法 (最近的共同祖先)poj 1330

    Nearest Common Ancestors Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 20983   Accept ...

  9. 在WPF中处理Windows消息

    在Winform中 处理Windows消息通过重写WndProc方法 在WPF中 使用的是System.Windows. Sytem.Windows.Controls等名字空间,没有WndProc函数 ...

  10. centos7安装并配置svn(转)

    一.安装 1. 通过 yum install subversion来安装 2. 查看svn版本 使用: svnserve –version 3. 创建svn版本库 使用命令: svnadmin cre ...