DMOZ中文网站分类目录-免费收录各类优秀网站的中文网站目录.
  • DmozDir.org
DMOZ目录快速登录入口-免费收录各类优秀网站的中文网站目录.由人工编辑,并提供网站分类目录检索及地区分类目录检索,是站长免费推广网站的有力平台!

有效的域模型的验证与Hibernate验证

  • 有效的域模型的验证与Hibernate验证

  • 已被浏览: 64 次2020年10月14日    来源:  DMOZ中文网站分类目录
  • 一个动手指导与Java bean中的验证标准(JSR 303)和Hibernate验证域模型验证(Apache的BVAL很相似。)

    让我们面对它,领域模型验证一直是一个相当untamable兽(最有可能这不会很快改变),因为验证过程本身牢固地结合到它发生的背景。这是可行的,但是,通过使用一些外部类库,而不是搞乱我们的生活从头开始做自己封装的验证机制。这正是Hibernate验证进场时,基于注释的参考实现的Java bean中的验证1.0 / 1.1(JSR 303),一个强大的验证模型附带的Java EE 6和更高。

    本文将引导您以务实的方式使用Hibernate的验证。

    域模型验证的语境性质

    独立您所选择的语言,构建丰富的领域模型是可以解决作为开发商最有挑战性的任务之一。而最重要的是你必须确保该水合物模型中的数据是有效的,从而保证其完整性正确维护。不幸的是,在许多情况下使得域对象中包含应用程序的情况下有效的是远离琐碎,由于本身的验证过程的内在性质的上下文。

    把它以另一种方式:(例如,通过使用简单的依赖注入,工厂,建筑工地等),而不是由外部上层,然后验证对象如果一个域对象所采取的参数是由应用程序的环境提供应是直接的和限制在非常有限的范围。

    相反,如果有问题的参数从外层(用户接口层是一个很好的例子)注入,验证过程可能是麻烦的和繁琐的,在大多数情况下,导致具有分散在多个应用层中的样板代码块。

    最终,一切都归结为这个简单而基本的问题:是什么让一个域对象有效?如果其状态正在持续或更新数据库中被验证之前,或在传递给周围的其他层(县)?符合逻辑的答案是:这要看情况。请记住,验证总是情境!所以不管什么办法,你用它来决定你的域对象是否有效,Java组件验证将简化流程。

    与JSR 303引入的Java Bean验证

    在此之前的Java EE 6,爪哇没有提供由平均一个集中机制的验证域类领域的标准方法。但事情已经改变了自那时起就更好了。在Java Beans验证规范使得它很容易选择校验类领域(乃至整个班)通过使用约束带几个直观的注解声明。

    在写这篇文章的时候,JSR 303只有两个标准的实现,你可以拿起摆在那里,阿帕奇BVAL和Hibernate的验证。后者是参考实现,其可以消耗作为单独的库,从流行的ORM框架完全解耦。

    随着中说,我们现在如何开始使用了Java bean中的验证/ Hibernate验证串联在现实世界中进行有效的域模型验证开始看。

    定义一个基本的域模型

    像往常一样,一个很好的方式来展示如何利用Java组件验证用于验证域模型是一个具体的例子。考虑到作为域模型的一部分标准实现了基于注解的验证架构,该班必须以注释的限制。

    在这种情况下,为了清楚起见,我要验证的域模型将仅由一个天真,贫血类,这将是用户对象的蓝图:

    <预的tabindex = “0” 类= “语言的Java ”> <代码类=“ java语言的Java”>公共类用户{

    私人诠释ID;

    @NotEmpty(消息=“名称是强制性的”)

    @Size(分= 2,最大值= 32,

    消息=“名称必须是2和32之间的字符”)

    私人字符串名称;

    @NotEmpty(消息=“电子邮件是强制性的”)

    @Email(消息=“电子邮件必须是合式地址”)

    私人字符串电子邮件;

    @NotEmpty(消息=“传是强制性的”)

    @Size(分钟= 10,最大= 140,

    消息=“传必须是10到140个字符之间的长”)

    私人字符串传记;

    公众用户(字符串名称,字符串电子邮件,字符串传记){

    this.name =名称;

    this.email =电子邮件;

    this.biography =传记;

    }

    // getter和setter方法的姓名,电子邮件和传记

    }

    没有什么值得除了在每个字段的顶部声明的约束讨论。例如,在 @NotEmpty(消息= “名称是强制性的”)标注状态的<代码>名称字段必须是,是,一个非空字符串。尽管这是不言自明,在消息属性用于定义如果受约束的场引起了违反被验证时将显示的消息。更妙的是它可以自定义,以表达更完善的标准与参数的许多限制。考虑<代码> @Size(分钟= 2,最大值= 32,消息= “...”)标注。它表达了,好了,正好有消息说什么。不是火箭科学,对吧?该规范提供一些更多的,得心应手的注释。要查看完整列表,欢迎随时检查。

    验证约束

    Microscope Hibernate Validation

    在这一点上,我们已经成功通过使用Java bean中的验证,这是一个好精细定义约束模型类。但是,你可能想知道是什么这样做的实际好处?在简洁的答案是:没有 - 至今。类是准备进行验证,确认,但这里缺少的部分是有一个机制,能够扫描注释,检查分配给约束字段的值,并返回验证错误(或在JSR 303术语中,约束冲突)。而这正是Hibernate验证是如何工作的引擎盖下。

    但是,让我们坦率地说:上面的解释是刚刚技术废话,如果我们没有看到至少一个人为的例子,说明如何使用Hibernate验证验证<代码>用户类:

    <预的tabindex = “0” 类= “语言的Java ”> <代码类=“ java语言的Java”>验证器验证= Validation.buildDefaultValidatorFactory()getValidator();

    用户的用户=新用户(“李四”,“无电子邮件”,“”);

    验证器

    .validate(用户).stream()

    .forEach(违反 - >的System.out.println(violation.getMessage()));

    这是很容易,不是吗?该代码段首先通过静态抓住Hibernate验证的一个实例的 buildDefaultValidatorFactory() getValidator()属于Bean验证API的一部分方法,以及使用<代码>验证()用于验证潜在无效用户对象的方法。在这种情况下,约束违规使用流和lambda表达式完全显示在控制台中。这是可能的,但是,通过使用标准<代码>的循环,而不是较新的<代码>的forEach 以获得相同的结果。

    在服务组件封装验证逻辑

    当然,这是可笑的简单(而且非常非常诱人的,坦率地说)开始丢弃<代码>验证的情况下,在这里和那里,并验证限制类在多个地方,甚至在错误的!但是,这将是DRY原则的公然违反(又名湿液),这将导致重复的代码在几个层。是的,绝对是糟糕的设计。

    相反,它会是一个很多更有效的封装Hibernate验证解耦服务组件的边界,这可能随处潜在重用内。简而言之,所有我们需要为它包装这样一个服务组件的围墙背后做的是一个简单的合同,通过接口定义,具有广泛通用的实现:

    <预的tabindex = “0” 类= “语言的Java ”> <代码类=“ java语言的Java”>公共接口EntityValidator {

    >验证(T T);

    }

    公共类BaseEntityValidator 器具EntityValidator {

    保护最终验证验证;

    公共BaseEntityValidator(验证器验证器){

    this.validator =验证器;

    }

    公共集>验证(T t)的{

    返回validator.validate(T);

    }

    }

    通过使用普通的委派,我们已经创建了一个工作验证模块,这需要在构造一个符合JSR 303的实现中,并使用其<代码>验证()用于验证类型的给定对象的方法<代码> ?。唯一的细节这里值得指出的是,在讨论的方法返回一个包含相应的约束违反对象集,之后该对象已正确验证。

    乍一看,在 BaseEntityValidator 类看起来相当简单。但是,这仅仅是一个错误的印象,相信我。该类不仅需要基于接口的多态的优势(又名亚型多态性),它也作为一个适配器来验证自身,从而使其能够有选择地暴露验证器的本地方法的客户端代码,甚至可以添加特定域的。

    如果你想知道如何使用 BaseEntityValidator 类来验证用户对象,这里是应该如何进行处理:

    <前的tabindex =“0”级=“语言的Java‘> <代码类=’java语言的Java”> //最好验证被注入,但在这种情况下,我们将明确地创建它

    EntityValidator <用户> userValidator =新BaseEntityValidator <>(Validation.buildDefaultValidatorFactory()getValidator());

    用户的用户=新用户(“李四”,“无电子邮件”,“”);

    验证器

    .validate(用户).stream()

    .forEach(违反 - >的System.out.println(violation.getMessage()));

    此外,有足够的空间,在不同的环境和场景使用类。例如,我们可以开发一个基本的Web应用程序,类似于通过一个HTML表单有效和高性能的方式提交了一个我建在Servlet API的教程,并验证用户数据。作为建立这样的Web应用程序是明确这个职位的范围,任务将要开始拉Hibernate验证的缰绳在Web地形留家庭作业给你,以防万一。

    创建自定义验证约束和验证器

    在这一点上,应该明确的是,Hibernate验证是一个难以击败的竞争者,当涉及到在一个简单的方式验证域对象。但是,还有更多尚未:即使在JSR 303个船在默认情况下一套强大约束冲突,这将覆盖每日开发商和你我一样最典型的验证需求,值得一提的是它的核心功能可以通过以下方式很容易地扩展自定义验证约束和验证。

    事实上,创建一个自定义的验证约束和匹配的自定义验证的是,可以归结为以下步骤一个没有脑子的过程:

      定义的注释接口,必须指定验证约束的目标(S),用于注释信息多久可用编译器(又名保留策略),最后与约束关联的自定义验证类。

      创建自定义的验证类本身。

      与往常一样,一个动手的例子是掌握这个过程的基本逻辑的最佳方式。所以,让我们说,我们要自定义的电子邮件验证约束适用于类的用户的,而不是使用附带的JSR 303在这种情况下,默认的,我们首先需要定义相应的注释界面,如下:

      <预的tabindex = “0” 类= “语言的Java ”> <代码类=“ java语言的Java”> @目标({ElementType.METHOD,ElementType.FIELD})

      @Retention(RetentionPolicy.RUNTIME)

      @Constraint(validatedBy = EmailValidator.class)

      公共@interface ValidEmail {

      字符串消息()默认的“电子邮件必须是结构良好地址”;

      <?>类[]基团()默认{};

      类<?延伸净荷> []有效载荷()默认{};

      }

      如上所示,在 ValidEmail 标注告诉编译器约束违反应保留直到运行时(<码> @Retention(RetentionPolicy.RUNTIME)),并适用于这两种方法和字段<代码>(@目标({ElementType.METHOD,ElementType.FIELD}),它很清楚的这里看到<代码> @Constraint 标注结合自定义约束到自定义<代码>为EmailValidator 类,我们将看一下检查注释的方法之后。

      最后,在消息()方法限定,当然,如果约束被违反,必须显示的消息。

      此外,在基团()方法允许指定,当验证程序被称为约束应验证,在每个组的基础。默认情况下,所有的约束默认组内检查,这意味着每个约束会不管目标对象的生命周期阶段的验证。这是可能的,然而,要设置不同的组中的简单的接口的形式,并且指定哪些约束必须根据特定的生命周期阶段进行验证。为简洁起见,上面的例子中使用默认的组。

      最后,<代码>有效载荷()可用于方法用于连接有效载荷对象,保存有关的约束的其他信息,并验证该目标对象时可以取出。

      现在让我们转向<代码>为EmailValidator 类,它实现了实际的验证。这里是一个幼稚的做法是怎么看:

      <预的tabindex = “0” 类= “语言的Java ”> <代码类=“ java语言的Java”>公共类为EmailValidator器具ConstraintValidator {

      私有静态最终格局VALID_EMAIL_PATTERN = Pattern.compile(

      “^ [A-Z0-9 ._%+ - ] + @ [A-Z0-9 .-] + \\ [A-Z] {2,6-} $”,

      Pattern.CASE_INSENSITIVE);

      @覆盖

      公共无效初始化(ValidEmail constraintAnnotation){

      //可以用来设置实例了审定

      }

      @覆盖

      公共布尔参考isValid(

      字符串email,ConstraintValidatorContext constraintValidatorContext){

      匹配器匹配= VALID_EMAIL_PATTERN.matcher(电子邮件);

      返回matcher.find();

      }

      }

      有一对夫妇只细节值得强调的位置:第一种是自定义的验证器必须实现本地<代码> ConstraintValidator 的接口,指定类型参数自定义约束的类型(这里的 ValidEmail < /代码>)和类型被限制(<码>字符串)。第二个细节是<代码> isValid()的方法本身,这验证了提供电子邮件address.Last但并非最不重要的,在电子邮件的声明的<代码>用户内场< /代码>类必须进行重构,这样,它可以结合自定义验证约束到自定义<代码>为EmailValidator 类,如下所示:

      <预的tabindex = “0” 类= “语言的Java ”> <代码类=“ java语言的Java”> @ ValidEmail

      私人字符串电子邮件;

      最后,验证用户对象长得一模一样使用默认的电子邮件验证时。

      这是很容易理解的,对不对?当然,我不是说,你永远需要弄乱你的生活通过创建自定义的约束和验证,因为这将降级的Java bean中的验证的功能几乎为零。尽管如此,从设计的角度来看是非常有用的知道,标配提供定制的体面水平。

      结论

      在这一点上,你已经学会了如何通过侧使用Java bean中的验证和Hibernate验证方,以验证在一个简单的方法你的域对象的基本知识。此外,您看到真的很容易定制的约束和自定义验证扩展规范的核心功能,在那些使用情况下,默认的值,就不会满足您的个人需要。此外,请记住,JSR 303是正在进行的工作在一个相当快的速度移动(其实Java组件的版本验证2.0是指日可待),所以一定要保持最新的最新消息。

      那么,是所有我们需要知道,当涉及到利用该标准带来的表的功能?那么,从出发点是,确实如此。与其他许多语言相关的功能,但是,它不是治疗所有潜在的验证顽疾你的代码可以从受苦,所以在适当的和自觉的方式使用它是万能的,像往常一样,取决于我们。

      很可能,使用的事实,它可以轻松地实现高度解耦验证组件,它可以几乎无处不在重复使用规范的谎言最大的好处。如果这唯一的参数并不引人注目足以让你开始使用Java bean中的验证向右走,肯定什么也不会。你还在等什么?


      以上信息来源于网络,如有侵权,请联系站长删除。

      TAG:模型 领域 有效 验证 休眠

    1. 上一篇:我如何在1.5个月制造2000 $与谷歌基于表单的MVP开始
    2. 与“有效的域模型的验证与Hibernate验证”相关的资讯
    3. 有效品牌战略的10个步骤将会担住您的业务
    4. 详解Go语言I/O多路复用netpoller模型
    5. R语言时间序列TAR阈值自回归模型
    6. 我拿模型当朋友,模型却想泄漏我的隐私?
    7. 【高级开发进阶】1.1.3 双亲委派模型及如何打破