在Java SE中使用Hibernate Bean Validator

Bean Validation主页上指出:“ Bean Validation是Java规范,…在Java SE中运行,但集成在Java EE(6和7)中。” 这篇文章演示了如何在Java EE容器之外使用Java Bean验证参考实现( Hibernate Validator )。 这篇文章中的示例基于Hibernate Validator 5.1.3 Final ,可从http://hibernate.org/validator/downloads下载。

Hibernate Validator入门 ”指出,Hibernate Validator需要统一表达语言JSR 341 )和上下文和依赖项注入CDI / JSR 346 )的实现。 这些规范的实现可在符合Java EE的现代容器(应用程序服务器)中使用,但是在Java SE环境中使用Hibernate Validator需要采购和使用单独的实现。

“ Hibernate Validator入门”页面提供了一种Maven XML,可以用来识别对Expression Language API (我正在使用Expression Language 3.0 API ), Expression Language实施 (我正在使用Expression Language Implementation 2.2.6 )的依赖性。 ,以及Hibernate Validator CDI便携式扩展 (我正在使用Hibernate Validator便携式扩展5.1.3 Final )。 我还使用Bean Validation API 1.1.0 FinalJBoss Logging 3.3.0 FinalClassMate 1.2.0来构建和运行示例。

本文中演示的bean验证示例定义了三个Java类。 Car.java是从“ Hibernate Validator入门 ”页面上提供的示例改编而成的一类,接下来显示其代码清单。

汽车.java

package dustin.examples;

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

/**
 * Example adapted from "Getting Started with Hibernate Validator"
 * (http://hibernate.org/validator/documentation/getting-started/).
 */
public class Car
{
   @NotNull
   private String manufacturer;

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

   @Min(2)
   private int seatCount;

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

   public String getManufacturer()
   {
      return manufacturer;
   }

   public String getLicensePlate()
   {
      return licensePlate;
   }

   public int getSeatCount()
   {
      return seatCount;
   }

   @Override
   public String toString()
   {
      return "Car{" +
         "manufacturer='" + manufacturer + '\'' +
         ", licensePlate='" + licensePlate + '\'' +
         ", seatCount=" + seatCount +
         '}';
   }
}

Garage.java定义了Garage.java示例中使用的另一个类, Garage.java主要是Car的多个实例的包装。 它的主要目的是帮助说明Hibernate Bean Validator支持的递归验证。

车库.java

package dustin.examples;

import javax.validation.Valid;
import javax.validation.constraints.Size;

import java.util.Collections;
import java.util.HashSet;
import java.util.Set;

/**
 * Holds cars.
 */
public class Garage
{
   @Size(min = 1)
   @Valid
   private final Set<Car> cars = new HashSet<>();

   public Garage() {}

   public void addCar(final Car newCar)
   {
      cars.add(newCar);
   }

   public Set<Car> getCars()
   {
      return Collections.unmodifiableSet(this.cars);
   }
}

上面列出的Garage代码使用@Valid批注指示也应验证该类持有的Car实例(“验证级联”)。

本文的示例中使用的最后一个Java类是将实际执行两个带bean验证注释的类CarGarage验证的类。 该类的清单如下所示。

HibernateValidatorDemonstration.java

package dustin.examples;

import static java.lang.System.out;

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

/**
 * Demonstrate use of Hibernate Validator.
 */
public class HibernateValidatorDemonstration
{
   private final Validator validator;

   public HibernateValidatorDemonstration()
   {
      final ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
      validator = factory.getValidator();
   }

   public void demonstrateValidator()
   {
      final Car nullManufacturerCar = new Car(null, "ABC123", 4);
      final Set<ConstraintViolation<Car>> nullMfgViolations = validator.validate(nullManufacturerCar);
      printConstraintViolationsToStandardOutput("Null Manufacturer Example", nullMfgViolations);

      final Car nullLicenseCar = new Car("Honda", null, 3);
      final Set<ConstraintViolation<Car>> nullLicenseViolations = validator.validate(nullLicenseCar);
      printConstraintViolationsToStandardOutput("Null License Example", nullLicenseViolations);

      final Car oneSeatCar = new Car("Toyota", "123ABC", 1);
      final Set<ConstraintViolation<Car>> tooFewSeatsViolations = validator.validate(oneSeatCar);
      printConstraintViolationsToStandardOutput("Too Few Seats Example", tooFewSeatsViolations);

      final Car oneDigitLicenseCar = new Car("General Motors", "I", 2);
      final Set<ConstraintViolation<Car>> tooFewLicenseDigitsViolation = validator.validate(oneDigitLicenseCar);
      printConstraintViolationsToStandardOutput("Too Few License Digits Example", tooFewLicenseDigitsViolation);

      final Car nullManufacturerNullLicenseCar = new Car(null, null, 4);
      final Set<ConstraintViolation<Car>> nullMfgLicenseViolation = validator.validate(nullManufacturerNullLicenseCar);
      printConstraintViolationsToStandardOutput("Null Manufacturer and Null License Example", nullMfgLicenseViolation);

      final Garage garage = new Garage();
      final Set<ConstraintViolation<Garage>> noCarsInGarage = validator.validate(garage);
      printConstraintViolationsToStandardOutput("No Cars in Garage", noCarsInGarage);

      garage.addCar(oneDigitLicenseCar);
      garage.addCar(oneSeatCar);
      garage.addCar(nullManufacturerNullLicenseCar);
      final Set<ConstraintViolation<Garage>> messedUpCarsInGarage = validator.validate(garage);
      printConstraintViolationsToStandardOutput("Messed Up Cars in Garage", messedUpCarsInGarage);
   }

   private <T> void printConstraintViolationsToStandardOutput(
      final String title,
      final Set<ConstraintViolation<T>> violations)
   {
      out.println(title);
      for (final ConstraintViolation<T> violation : violations)
      {
         out.println("\t" + violation.getPropertyPath() + " " + violation.getMessage());
      }
   }

   public static void main(final String[] arguments)
   {
      final HibernateValidatorDemonstration instance = new HibernateValidatorDemonstration();
      instance.demonstrateValidator();
   }
}

上面的代码具有对javax.validation.Validator.validate(T,Class <?>)的多次调用,这些调用演示了对正在验证其实例的类的注释的有效性。 几个示例验证对象的单个验证冲突,一个示例验证对象的多个验证冲突,最后一个示例演示成功的级联冲突检测。

HibernateValidatorDemonstration类具有main(String[])函数,可以在Java SE环境中执行该函数(假定必需的JAR位于运行时类路径上)。 接下来显示运行上述演示类的输出:

Jul 19, 2015 9:30:05 PM org.hibernate.validator.internal.util.Version 
INFO: HV000001: Hibernate Validator 5.1.3.Final
Null Manufacturer Example
 manufacturer may not be null
Null License Example
 licensePlate may not be null
Too Few Seats Example
 seatCount must be greater than or equal to 2
Too Few License Digits Example
 licensePlate size must be between 2 and 14
Null Manufacturer and Null License Example
 manufacturer may not be null
 licensePlate may not be null
No Cars in Garage
 cars size must be between 1 and 2147483647
Messed Up Cars in Garage
 cars[].licensePlate size must be between 2 and 14
 cars[].manufacturer may not be null
 cars[].licensePlate may not be null
 cars[].seatCount must be greater than or equal to 2

结论

这篇文章证明了Bean验证规范的参考实现Hibernate Bean Validator可以在Java SE环境中执行。 作为演示的一部分,还讨论了与Bean验证规范和Hibernate Bean验证器实现相关的一些基本概念。

其他资源

翻译自: https://www.javacodegeeks.com/2015/07/using-hibernate-bean-validator-in-java-se.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值