0
点赞
收藏
分享

微信扫一扫

Hibernate Validator 6.0.13 起步

蛇发女妖 2022-02-05 阅读 64


视频播放地址

  • 解读Hibernate-Validator官方文档入门篇
    ​​​http://v.youku.com/v_show/id_XMzk1NTY1NjkxMg==.html​​

1.起步

本章将向您展示如何开始使用Hibernate Validator,即Bean Validation的参考实现(RI)对于以下的快速启动,您需要:(This chapter will show you how to get started with Hibernate Validator, the reference implementation (RI) of Bean Validation. For the following quick-start you need:)


  • maven
  • jdk8
  • 有网络

1.1 建立工程

为了在Maven项目中使用Hibernate Validator,只需将下列依赖项添加到pom.xml:

<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.13.Final</version>
</dependency>

这个传递性依赖于bean验证API__ (javax.validation:validation-api:2.0.1.Final).__

1.1.1 EL 表达式

Hibernate验证器需要统一表达式语言(JSR 341)的实现,用于评估约束违反消息中的动态表达式(see ​​Section 4.1, “Default message interpolation”​​)。当您的应用程序运行在JavaEE容器(如JBoss)中时,容器已经提供了EL实现。但是,在Java SE环境中,必须将实现作为依赖关系添加到POM文件中。例如,可以使用JSR 341引用实现添加以下依赖项:

<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.el</artifactId>
<version>3.0.1-b09</version>
</dependency>


NOTE: 对于无法提供EL实现的环境,Hibernate验证器提供了一个第12.9节“PuleMeLaseIdabor”。然而,这种插值器(interpolator)的使用不是符合bean验证规范的。
(For environments where one cannot provide a EL implementation Hibernate Validator is offering a​​Section 12.9, “ParameterMessageInterpolator”​​. However, the use of this interpolator is not Bean Validation specification compliant.)


1.1.2 CDI (Contexts and Dependency Injection for Java TM EE, JSR 346)

Bean验证定义了与CDI(JavaTM EE, ​​JSR 346​​的上下文和依赖注入)的集成点。如果您的应用程序运行在不提供这种集成的环境中,则可以通过将以下Maven依赖项添加到POM中,使用Hibernate验证器CDI可移植扩展插件:

<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator-cdi</artifactId>
<version>6.0.13.Final</version>
</dependency>


[​​Java EE】–Contexts and Dependency Injection (上下文与依赖注入)04​​ 这里有简单的介绍JSR 346



Note:注意,在__JavaEE应用服务器上运行的应用程序通常不需要添加该依赖项__。您可以在第11.3节“CDI”中了解更多关于Bean验证和CDI的集成。​​Section 11.3, “CDI”​​.


1.1.3 Running with a security manager

Hibernate验证程序支持启用​​安全管理器​​​运行。为此,必须为Hibernate Validator、Bean验证API、Classmate和JBoss Logging的代码库以及调用Bean Validation的代码库分配若干权限。下面显示了如何通过​​策略文件​​实现这一点,这是由Java默认策略实现处理的:

grant codeBase "file:path/to/hibernate-validator-6.0.13.Final.jar" {
permission java.lang.reflect.ReflectPermission "suppressAccessChecks";
permission java.lang.RuntimePermission "accessDeclaredMembers";
permission java.lang.RuntimePermission "setContextClassLoader";

permission org.hibernate.validator.HibernateValidatorPermission "accessPrivateMembers";

// Only needed when working with XML descriptors (validation.xml or XML constraint mappings)
permission java.util.PropertyPermission "mapAnyUriToUri", "read";
};

grant codeBase "file:path/to/validation-api-2.0.1.Final.jar" {
permission java.io.FilePermission "path/to/hibernate-validator-6.0.13.Final.jar", "read";
};

grant codeBase "file:path/to/jboss-logging-3.3.2.Final.jar" {
permission java.util.PropertyPermission "org.jboss.logging.provider", "read";
permission java.util.PropertyPermission "org.jboss.logging.locale", "read";
};

grant codeBase "file:path/to/classmate-1.3.4.jar" {
permission java.lang.RuntimePermission "accessDeclaredMembers";
};

grant codeBase "file:path/to/validation-caller-x.y.z.jar" {
permission org.hibernate.validator.HibernateValidatorPermission "accessPrivateMembers";
};

1.1.5 在WildFly中更新Hibernate验证器

​​WildFly应用服务器​​中包含了Hibernate验证器。为了将Bean Validation API和Hibernate Validator的服务器模块更新到最新的和最大的,可以使用WildFly的补丁机制。

可以使用以下依赖项从SourceForge或从Maven Central下载补丁文件:

  • Example 1.5: Maven dependency for WildFly 14.0.0.Beta1 patch file
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator-modules</artifactId>
<version>6.0.13.Final</version>
<classifier>wildfly-14.0.0.Beta1-patch</classifier>
<type>zip</type>
</dependency>
  • Example 1.6: Maven dependency for WildFly 13.0.0.Final patch file
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator-modules</artifactId>
<version>6.0.13.Final</version>
<classifier>wildfly-13.0.0.Final-patch</classifier>
<type>zip</type>
</dependency>

下载了补丁文件后,可以通过运行此命令将其应用于WildFly:

$JBOSS_HOME/bin/jboss-cli.sh patch apply hibernate-validator-modules-6.0.13.Final-wildfly-14.0.0.Beta1-patch.zip

如果要撤消补丁并返回最初随服务器一起提供的Hibernate Validator版本,请运行以下命令:

$JBOSS_HOME/bin/jboss-cli.sh patch rollback --reset-configuration=true

~~1.1.6 Java 9 ~~

1.2 应用约束(Applying constraints)

让我们直接讲解一个例子,看看如何应用约束(也就是Hibernate Validator)。

package org.hibernate.validator.referenceguide.chapter01;

import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

public class Car {

@NotNull
private String manufacturer;

@NotNull
@Size(min = 2, max = 14)
private String licensePlate;

@Min(2)
private int seatCount;

public Car(String manufacturer, String licencePlate, int seatCount) {
this.manufacturer = manufacturer;
this.licensePlate = licencePlate;
this.seatCount = seatCount;
}

//getters and setters ...
}

The @NotNull, @Size and @Min annotations are used to declare the constraints which should be applied to the fields of a Car instance:(@NotNull、@Size和@Min注释用于声明应该应用于Car实例字段的约束)


  • manufacturer 字段不能为null
  • licensePlate must never be null and must be between 2 and 14 characters long
  • seatCount must be at least 2


您可以在GitHub上的Hibernate Validator源代码库中找到本参考指南中使用的所有示例的​​完整源代码​​。
​​​https://github.com/hibernate/hibernate-validator/tree/master/documentation/src/test​​​ 这里不怎么好找到


1.3 验证约束( Validating constraints)

要执行这些约束的验证,您需要使用一个验证器实例。让我们看一下汽车的单元测试:[可以自己下载下来玩一下子]

package org.hibernate.validator.referenceguide.chapter01;

import java.util.Set;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;

import org.junit.BeforeClass;
import org.junit.Test;

import static org.junit.Assert.assertEquals;

public class CarTest {

private static Validator validator;

@BeforeClass
public static void setUpValidator() {
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
validator = factory.getValidator();
}

@Test
public void manufacturerIsNull() {
Car car = new Car( null, "DD-AB-123", 4 );

Set<ConstraintViolation<Car>> constraintViolations =
validator.validate( car );

assertEquals( 1, constraintViolations.size() );
assertEquals( "must not be null", constraintViolations.iterator().next().getMessage() );
}

@Test
public void licensePlateTooShort() {
Car car = new Car( "Morris", "D", 4 );

Set<ConstraintViolation<Car>> constraintViolations =
validator.validate( car );

assertEquals( 1, constraintViolations.size() );
assertEquals(
"size must be between 2 and 14",
constraintViolations.iterator().next().getMessage()
);
}

@Test
public void seatCountTooLow() {
Car car = new Car( "Morris", "DD-AB-123", 1 );

Set<ConstraintViolation<Car>> constraintViolations =
validator.validate( car );

assertEquals( 1, constraintViolations.size() );
assertEquals(
"must be greater than or equal to 2",
constraintViolations.iterator().next().getMessage()
);
}

@Test
public void carIsValid() {
Car car = new Car( "Morris", "DD-AB-123", 2 );

Set<ConstraintViolation<Car>> constraintViolations =
validator.validate( car );

assertEquals( 0, constraintViolations.size() );
}
}

In the setUp() method a Validator object 从验证器工厂检索验证器对象。验证器实例是线程安全的,可以多次重用。因此,它可以安全地存储在静态字段中,并在测试方法中使用来验证不同的Car实例。

validate()方法返回一组ConstraintViolation实例,您可以迭代这些实例以查看发生了哪些验证错误。前三种测试方法显示了一些预期的约束违反:


  • The @NotNull constraint on manufacturer is violated in manufacturerIsNull()
  • The @Size constraint on licensePlate is violated in licensePlateTooShort()
  • The @Min constraint on seatCount is violated in seatCountTooLow()
  • 如果对象验证成功,validate()将返回一个空集,如carIsValid()所示。
    Note:注意,只使用来自包javax.validation校验的类。这些是从bean验证API提供的。没有直接引用来自Hibernate验证器的类,从而产生可移植代码。

1.4 下一步去哪里?(Where to go next?)

这结束了5分钟的穿越Hibernate验证程序和Bean验证的世界。继续探索代码示例或查看在第14章(进一步阅读)中引用的其他示例。

若要了解有关bean和属性验证的更多信息,请继续阅读第2章,声明和验证bean约束。如果您有兴趣使用bean验证来验证方法前、后条件,请参阅第3章,声明和验证方法约束。如果您的应用程序具有特定的验证需求,请参见第6章,创建自定义约束。



举报

相关推荐

0 条评论