发生了什么

再一次苦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. 配置JVM内存 查看内存工具

    一.配置JVM内存 1.配置JVM内存的參数有四个: -XmxJavaHeap最大值.默认值为物理内存的1/4.最佳设值应该视物理内存大小及计算机内其它内存开销而定. -XmsJavaHeap初始值, ...

  2. Socket编程实践(12) --UDP编程基础

    UDP特点 无连接,面向数据报(基于消息,不会粘包)的传输数据服务; 不可靠(可能会丢包, 乱序, 反复), 但因此普通情况下UDP更加高效; UDP客户/服务器模型 UDP-API使用 #inclu ...

  3. word2vec 中的数学原理具体解释(四)基于 Hierarchical Softmax 的模型

      word2vec 是 Google 于 2013 年开源推出的一个用于获取 word vector 的工具包,它简单.高效,因此引起了非常多人的关注.因为 word2vec 的作者 Tomas M ...

  4. Linq 导出Excel

    var d = db.User; Repeater1.DataSource = d.ToList(); Repeater1.DataBind(); string guid = Guid.NewGuid ...

  5. 9patch(.9)怎么去掉自己画上的黑点/黑线

    在自己制作.9.png图片的时候,制作之后所制作的图片上面会显示出制作的痕迹,也即是图片区域上会显示小黑点和黑线.那么为了真正的利用.9.png图片的使用效果.这些瑕疵当然是不能出现的了.因此,要想办 ...

  6. windows下cocos2dx3.0开发环境及Android编译环境搭建

    cocos2dx更新到了3.x版本号,自己一直没有换,如今开发组要求统一换版本号,我就把搭建好开发环境的过程记录下来. 一.Windowns下开发环境搭建 1.  所需工具         1)coc ...

  7. C该程序生成一个唯一的序列号

    在实际的软件开发项目,通常,它包括产生一唯一的序列号.在本文中,一个切实可行的方案,例如,它引入了一个唯一的序列号生成过程. 本文生成的序列号的样式为:MMDDHHMINSS_XXXXXX. 程序例如 ...

  8. extjs的相关属性

    通用属性: labelSeparator:''//表示fieldLabel后不会显示冒号":" readOnly:true//仅仅读 focusCls: 'txtHalfInput ...

  9. hdu 4268 Alice and Bob(multiset|段树)

    Alice and Bob Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  10. go语言实现遍历目录,及查找特定的文件类型

    // filelist.go package main import ( //"flag" "fmt" "os" "path/fi ...