SpringJava8Lambda表达式验证
我正在读关于使用谓词here进行验证的文章。我试图在SpringBoot框架中实现它,在这里我遇到了一些问题
在守则中:
public class LamdaPersonValidator implements PersonValidator {
public void validate(Person person) {
notNull.and(between(2, 12)).test(person.getFirstName()).throwIfInvalid("firstname");
notNull.and(between(4, 30)).test(person.getLastName()).throwIfInvalid("secondname");
notNull.and(between(3, 50)).and(contains("@")).test(person.getEmail()).throwIfInvalid("email");
intBetween(0, 110).test(person.getAge()).throwIfInvalid("age");
}
}
没有提到验证方法中检查person对象本身是否为null的标准方法。只需要像if(persone != null) { // notNull.and..}
这样设置一个空检查就可以了吗?或者有更好的方法来执行空检查
另一件事是假设,我想做一些自定义检查,比如数据库中是否存在person。在这种情况下,我需要连接到数据库以进行检查。在这种情况下,我需要自动连接接口,其中静态变量和方法是不可能的
那么,在从数据库进行验证时,使用这种方法的最佳方法是什么
# 1 楼答案
您也可以这样编写GenericValidator:
为常见工作编写
AbstractValidator
类:编写
GenericValidator
类,该类将为验证实现扩展AbstractValidator
:请进行相应的测试。测试用例示例:
# 2 楼答案
我们不是神圣宗教裁判所的法典法官,所以我们没有义务告诉你们,是否“可以只做一个空检查”
当然,写一个普通的
if
语句是可以的,就像我们过去25年所做的那样,就像发明一个详细的框架封装null
检查并以某种方式将术语“lambda”引入其中也是可以的。剩下的唯一问题是,你是否真的打算写if(person != null) { /* do the checks */ }
,换句话说,允许null
人通过测试如果您想要拒绝
null
个人(这会更合理),那么已经有可能在不进行显式测试的情况下编写它,因为Java 7表明您不需要“使用lambdas一切都更好”框架来实现该目标。通常,与本文的示例相反,您可以使用常规代码合理地编写验证代码,使用&&
运算符等简单工具,并将常见代码放入方法中:这与您的代码相同,没有任何名称中带有“Lambda”的框架,仍然有可读的验证代码,并允许重用检查代码。也就是说,与反映实现方式的类名
LamdaPersonValidator
不同,您应该使用反映类的职责的类名。显然,负责验证对象的某些属性的验证器不应该与检查数据库中是否存在实体的验证器混淆。后者本身是一个完全不同的话题,也应该是一个独立的问题上面的代码只是一个如何实现与原始代码相同的示例。它不应该以这种形式出现在生产代码中,因为它是一种广泛的反模式的演示,对属性应用任意不合理的约束,很可能是程序员在编写代码时发明的
为什么它假设一个人必须有一个名字和一个姓氏,为什么它假设一个名字必须至少有两个字符,最多12个字符,而姓氏必须在4到30个字符之间
它实际上不是偶数字符,因为
char
单位和实际字符之间的关联不是1:1每个想实现名称验证的程序员都必须阅读Falsehoods Programmers Believe About Names (With Examples)
同样地,Wikipedia’s List of the verified oldest people列出了100名年龄在110岁以上的人
没有理由假设一个电子邮件地址不能超过50个字符。Atrue validation of the correct Email pattern可能是故意忽略的东西