这篇文章总结了一些简单易用的示例,这些示例说明了您想使用Java Beans Validation API(JSR 349,JSR 303)进行的最常见操作。 记住,Beans Validation独立于Java EE。 尽管它是作为Java EE兼容服务器的一部分内置的,但该API也可以在Java SE应用程序中轻松使用。 所有这些示例都使用Java SE。

要求

我使用以下主要技术完成了本文的所有工作。 您可能可以使用不同的技术或版本来做相同的事情,但不能保证。

  • Java 1.8.0_65_x64
  • NetBeans 8.2
  • Maven 3.0.5(与NetBeans捆绑在一起)
<dependency><groupId>javax.validation</groupId><artifactId>validation-api</artifactId><version>1.1.0.Final</version>
</dependency>
<dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator</artifactId><version>5.1.2.Final</version>
</dependency>
<dependency><groupId>javax.el</groupId><artifactId>javax.el-api</artifactId><version>2.2.4</version>
</dependency>
<dependency><groupId>org.glassfish.web</groupId><artifactId>javax.el</artifactId><version>2.2.4</version>
</dependency>
<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope>
</dependency>

下载

访问我的GitHub页面https://github.com/mjremijan以查看我所有的开源项目。 这篇文章的代码位于: https : //github.com/mjremijan/thoth-beanvalidation

基本

此示例显示了使用内置的标准约束和内置的标准验证器进行Bean验证的基础。

清单1.1 –验证的Bean

package org.thoth.beanvalidation.basics;import javax.validation.constraints.NotNull;public class Widget {@NotNullprotected String name;public String getName() {return name;}public void setName(String name) {this.name = name;}
}

清单1.2 –如何验证

package org.thoth.beanvalidation.basics;import java.util.Set;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;public class WidgetTest {protected Validator validator;@Beforepublic void before() {validator = Validation.buildDefaultValidatorFactory().getValidator();}@Testpublic void violations_size() {// setupWidget w = new Widget();// actionSet<ConstraintViolation<Widget>> violations= validator.validate(w);// assertAssert.assertEquals(1, violations.size());}@Testpublic void violation_message() {// setupWidget w = new Widget();// actionSet<ConstraintViolation<Widget>> violations= validator.validate(w);// assertConstraintViolation<Widget> v= violations.stream().findFirst().get();Assert.assertEquals("may not be null", v.getMessage());}@Testpublic void violation_messageTemplate() {// setupWidget w = new Widget();// actionSet<ConstraintViolation<Widget>> violations= validator.validate(w);// assertConstraintViolation<Widget> v= violations.stream().findFirst().get();Assert.assertEquals("{javax.validation.constraints.NotNull.message}", v.getMessageTemplate());}@Testpublic void violation_propertyPath() {// setupWidget w = new Widget();// actionSet<ConstraintViolation<Widget>> violations= validator.validate(w);// assertConstraintViolation<Widget> v= violations.stream().findFirst().get();Assert.assertEquals("name", v.getPropertyPath().toString());}
}

自定义消息模板

本示例说明了如何使用自定义错误消息而不是使用内置标准错误消息来定制内置标准约束。

清单2.1 – ValidationMessages.properties

Candy.name.NotNull=A candy name is required.

清单2.2 –验证的Bean

package org.thoth.beanvalidation.custommessage;import javax.validation.constraints.NotNull;public class Candy {@NotNull(message = "{Candy.name.NotNull}")protected String name;public String getName() {return name;}public void setName(String name) {this.name = name;}
}

清单2.3 –如何验证

package org.thoth.beanvalidation.custommessage;import java.util.Set;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;public class CandyTest {protected static Validator validator;@BeforeClasspublic static void before() {validator = Validation.buildDefaultValidatorFactory().getValidator();}@Testpublic void notnull_violation_message() {// setupCandy candy = new Candy();// actionSet<ConstraintViolation<Candy>> violations= validator.validate(candy);// assertConstraintViolation<Candy> v= violations.stream().findFirst().get();Assert.assertEquals("A candy name is required.", v.getMessage());}@Testpublic void notnull_violation_messageTemplate() {// setupCandy candy = new Candy();// actionSet<ConstraintViolation<Candy>> violations= validator.validate(candy);// assertConstraintViolation<Candy> v= violations.stream().findFirst().get();Assert.assertEquals("{Candy.name.NotNull}", v.getMessageTemplate());}
}

具有可变替换的自定义消息模板

此示例说明如何使用自定义错误消息配置内置的标准约束,该消息中包含变量值,该变量值在运行时由Bean验证替换。 可以替换的变量示例包括已验证的实际值以及@Size约束的min和max属性。

清单3.1 – ValidationMessages.properties

Candy.name.Size.message=The candy name "${validatedValue}" is invalid. It must be between {min} and {max} characters long

清单3.2 –验证的Bean

package org.thoth.beanvalidation.variablereplacement;import javax.validation.constraints.Size;public class Candy {private String name;@Size(message = "{Candy.name.Size.message}", min=5, max=10)public String getName() {return name;}public void setName(String name) {this.name = name;}
}

清单3.3 –如何验证

package org.thoth.beanvalidation.variablereplacement;import java.util.Set;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
import org.thoth.beanvalidation.variablereplacement.Candy;public class CandyTest {protected static Validator validator;@BeforeClasspublic static void before() {validator = Validation.buildDefaultValidatorFactory().getValidator();}@Testpublic void does_the_constraint_have_the_correct_messageTemplate() {// setupCandy candy = new Candy();candy.setName("");// actionSet<ConstraintViolation<Candy>> violations= validator.validate(candy);// assertConstraintViolation<Candy> v= violations.stream().findFirst().get();Assert.assertEquals("{Candy.name.Size.message}", v.getMessageTemplate());}@Testpublic void is_the_message_correct_if_size_is_too_small() {// setupCandy candy = new Candy();candy.setName("foo");// actionSet<ConstraintViolation<Candy>> violations= validator.validate(candy);// assertConstraintViolation<Candy> v= violations.stream().findFirst().get();Assert.assertEquals("The candy name \"foo\" is invalid. It must be between 5 and 10 characters long", v.getMessage());}@Testpublic void is_the_message_correct_if_size_is_too_big() {// setupCandy candy = new Candy();candy.setName("123456789|1");// actionSet<ConstraintViolation<Candy>> violations= validator.validate(candy);// assertConstraintViolation<Candy> v= violations.stream().findFirst().get();Assert.assertEquals("The candy name \"123456789|1\" is invalid. It must be between 5 and 10 characters long", v.getMessage());}
}

自定义属性验证器

本示例说明如何为类的属性创建您自己的约束和您自己的验证器。

清单4.1 – ValidationMessages.properties

org.thoth.beanvalidation.propertyvalidator.Excludes.message=The value "${validatedValue}" is one of {value} which is forbidden.

清单4.2 –约束注释

package org.thoth.beanvalidation.propertyvalidator;import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.validation.Constraint;@Target({ElementType.TYPE, ElementType.ANNOTATION_TYPE, ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = {ExcludesValidator.class})
@Documented
public @interface Excludes {String message() default "{org.thoth.beanvalidation.propertyvalidator.Excludes.message}";Class[] groups() default {};Class[] payload() default {};String[] value() default {};
}

清单4.3 –约束验证器

package org.thoth.beanvalidation.propertyvalidator;import java.util.Arrays;
import java.util.List;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;public class ExcludesValidatorimplements ConstraintValidator< Excludes, String> {private List<String> excludeTheseValues;@Overridepublic void initialize(Excludes arg) {String[] strarr = arg.value();if (strarr == null) {strarr = new String[]{};}excludeTheseValues = Arrays.asList(strarr);}@Overridepublic boolean isValid(String value, ConstraintValidatorContext cvc) {if (excludeTheseValues.contains(value)) {return false;} else {return true;}}
}

清单4.4 –验证的Bean

package org.thoth.beanvalidation.propertyvalidator;public class Candy {private String name;public Candy(String name) {this.name = name;}@Excludes({"foo", "bar", "shrubbery"})public String getName() {return name;}
}

清单4.5 –如何验证

package org.thoth.beanvalidation.propertyvalidator;import java.util.Set;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import static org.junit.Assert.assertEquals;
import org.junit.BeforeClass;
import org.junit.Test;public class CandyTest {protected static Validator validator;@BeforeClasspublic static void before() {validator = Validation.buildDefaultValidatorFactory().getValidator();}@Testpublic void a_non_excludeded_name_should_not_give_you_a_constraint_violation() {// setupCandy candy = new Candy("hershey");// actionSet<ConstraintViolation<Candy>> violations= validator.validate(candy);// assertassertEquals(0, violations.size());}@Testpublic void do_you_get_a_constraint_violation_if_you_use_excluded_name_foo() {// setupCandy candy = new Candy("foo");// actionConstraintViolation<Candy> violation= validator.validate(candy).iterator().next();// assertassertEquals("{org.thoth.beanvalidation.propertyvalidator.Excludes.message}", violation.getMessageTemplate());assertEquals("The value \"foo\" is one of [foo, bar, shrubbery] which is forbidden.", violation.getMessage());}@Testpublic void do_you_get_a_constraint_violation_if_you_use_excluded_name_bar() {// setupCandy candy = new Candy("bar");// actionConstraintViolation<Candy> violation= validator.validate(candy).iterator().next();// assertassertEquals("{org.thoth.beanvalidation.propertyvalidator.Excludes.message}", violation.getMessageTemplate());assertEquals("The value \"bar\" is one of [foo, bar, shrubbery] which is forbidden.", violation.getMessage());}@Testpublic void do_you_get_a_constraint_violation_if_you_use_excluded_name_shrubbery() {// setupCandy candy = new Candy("shrubbery");// actionConstraintViolation<Candy> violation= validator.validate(candy).iterator().next();// assertassertEquals("{org.thoth.beanvalidation.propertyvalidator.Excludes.message}", violation.getMessageTemplate());assertEquals("The value \"shrubbery\" is one of [foo, bar, shrubbery] which is forbidden.", violation.getMessage());}
}

自定义类验证器

本示例说明如何创建适用于整个的约束和验证器。

清单5.1 – ValidationMessages.properties

org.thoth.beanvalidation.classvalidator.IdentificationExists.message=At least one of social security number, drivers license number, or passport number must exist.

清单5.2 –约束注释

package org.thoth.beanvalidation.classvalidator;import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;@Target({ElementType.TYPE, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = {IdentificationExistsValidator.class})
@Documented
public @interface IdentificationExists {String message() default "{org.thoth.beanvalidation.classvalidator.IdentificationExists.message}";Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};
}

清单5.3 –约束验证器

package org.thoth.beanvalidation.classvalidator;import java.util.Objects;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;public class IdentificationExistsValidator implements ConstraintValidator<IdentificationExists, Identification> {@Overridepublic void initialize(IdentificationExists a) {}@Overridepublic boolean isValid(Identification t, ConstraintValidatorContext cvc) {boolean invalid =Objects.equals(t.getDriversLicenseNumber(), null)&&Objects.equals(t.getPassportNumber(), null)&&Objects.equals(t.getSocialSecurityNumber(), null);return !invalid;}
}

清单5.4 –验证的Bean

package org.thoth.beanvalidation.classvalidator;@IdentificationExists
public class Identification {protected String socialSecurityNumber;protected String driversLicenseNumber;protected String passportNumber;public String getSocialSecurityNumber() {return socialSecurityNumber;}public void setSocialSecurityNumber(String socialSecurityNumber) {this.socialSecurityNumber = socialSecurityNumber;}public String getDriversLicenseNumber() {return driversLicenseNumber;}public void setDriversLicenseNumber(String driversLicenseNumber) {this.driversLicenseNumber = driversLicenseNumber;}public String getPassportNumber() {return passportNumber;}public void setPassportNumber(String passportNumber) {this.passportNumber = passportNumber;}
}

清单5.5 –如何验证

package org.thoth.beanvalidation.classvalidator;import java.util.Set;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;public class IdentificationTest {protected Validator validator;@Beforepublic void before() {validator = Validation.buildDefaultValidatorFactory().getValidator();}@Testpublic void violation_if_all_are_missing() {// setupIdentification id = new Identification();// actionSet<ConstraintViolation<Identification>> violations= validator.validate(id);// assertConstraintViolation<Identification> v= violations.stream().findFirst().get();Assert.assertEquals("At least one of social security number, drivers license number, or passport number must exist.", v.getMessage());}@Testpublic void no_violation_if_social_security_number_exists() {// setupIdentification id = new Identification();id.setSocialSecurityNumber("a");// actionSet<ConstraintViolation<Identification>> violations= validator.validate(id);// assertAssert.assertEquals(0, violations.size());}@Testpublic void no_violation_if_drivers_license_number_exists() {// setupIdentification id = new Identification();id.setDriversLicenseNumber("a");// actionSet<ConstraintViolation<Identification>> violations= validator.validate(id);// assertAssert.assertEquals(0, violations.size());}@Testpublic void no_violation_if_passport_number_exists() {// setupIdentification id = new Identification();id.setPassportNumber("a");// actionSet<ConstraintViolation<Identification>> violations= validator.validate(id);// assertAssert.assertEquals(0, violations.size());}
}

组序列(短路)

本示例说明了在进行验证时如何使用@GroupSequence作为短路。 这意味着,如果第一轮验证未通过,则验证“短路”,并且不会执行第二轮验证。

默认情况下,所有bean验证约束都放入“默认”组序列中。 但是,通过将@GroupSequence放在类上(如下所示),仅针对该类重新定义“默认”组序列。 在下面的类上使用@GroupSequence ,其基本功能是在bean验证期间,第一个操作是验证该类中未专门分配组的所有约束。 首先是@NotNull约束。 如果所有这些都OK,那么第二个操作是验证Second.class组中的所有约束。 那就是@Size约束。 如果所有这些都OK,那么第三Third.class操作将验证Third.class组中的所有约束。 那就是@Pattern约束。 如果某个小组在任何时候都无法通过验证,则验证将“短路”,并且验证不再进行。

清单6.1 –验证的Bean

package org.thoth.beanvalidation.groupsequence;import javax.validation.GroupSequence;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;@GroupSequence({Candy.class, Candy.Second.class, Candy.Third.class})
public class Candy {protected interface Second {}protected interface Third {}private String name;@NotNull()@Size(min=4, max=10, groups = Second.class )@Pattern(regexp = "[a-z]", groups = Third.class)public String getName() {return name;}public void setName(String name) {this.name = name;}
}

清单6.2 –如何验证

package org.thoth.beanvalidation.groupsequence;import java.util.Set;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import static org.junit.Assert.assertEquals;
import org.junit.Before;
import org.junit.Test;public class CandyTest {private Validator validator;@Beforepublic void before() {validator = Validation.buildDefaultValidatorFactory().getValidator();}@Testpublic void short_circuits_first_if_null() {// setupCandy w = new Candy();// actionSet<ConstraintViolation<Candy>> violations//= validator.validate(w, CheckGroupSequence.class);= validator.validate(w);// assertassertEquals(1, violations.size());assertEquals("may not be null", violations.iterator().next().getMessage());}@Testpublic void short_circut_if_size_is_in_violation() {// setupCandy w = new Candy();w.setName("foo");// actionSet<ConstraintViolation<Candy>> violations= validator.validate(w);// assertassertEquals(1, violations.size());assertEquals("size must be between 4 and 10", violations.iterator().next().getMessage());}@Testpublic void short_circuit_if_pattern_is_in_violation() {// setupCandy w = new Candy();w.setName("SHRUBBERY");// actionSet<ConstraintViolation<Candy>> violations= validator.validate(w);// assertassertEquals(1, violations.size());assertEquals("must match \"[a-z]\"", violations.iterator().next().getMessage());}
}

摘要

Bean验证是一种功能强大的API,尤其是因为它可以在Java EE服务器或独立的Java SE应用程序中使用。 这只是Bean验证API基础知识的简短摘要,但是通常它足以涵盖开发人员有关如何使用它的大多数问题。

翻译自: https://www.javacodegeeks.com/2017/07/java-bean-validation-basics.html

Java Bean验证基础相关推荐

  1. java bean 验证_Java Bean验证基础

    java bean 验证 这篇文章总结了一些简单,快速的示例,这些示例说明了您想使用Java Beans Validation API(JSR 349,JSR 303)进行的最常见操作. 记住,Bea ...

  2. java bean验证_javaBean--登录验证

    packagecom.JAVABean; importjava.util.HashMap; importjava.util.Map; publiccla***egister{ privateStrin ...

  3. Apache CXF 3.0:JAX-RS 2.0和Bean验证1.1最终一起

    即将发布的出色的Apache CXF框架3.0版 (当前处于里程碑2阶段)带来了许多有趣且有用的功能,越来越接近提供完整的JAX-RS 2.0支持. Bean Validation 1.1的支持是我们 ...

  4. ejb+jpa_使用Arquillian(包括JPA,EJB,Bean验证和CDI)测试Java EE 6

    ejb+jpa 很长时间以来,我听到很多人对Arquillian说好话 . 尽管我一直在阅读有关其用法的文章,但实际上我无法在一篇文章中找到涵盖我认为重要的某些方面的文章. 当然,我看起来还不够努力. ...

  5. 使用Arquillian(包括JPA,EJB,Bean验证和CDI)测试Java EE 6

    很长时间以来,我听到很多人对Arquillian说好话 . 虽然我一直在阅读有关其用法的文章,但实际上我无法在一篇文章中找到涵盖我认为重要的某些方面的文章. 当然,我看起来还不够努力. 我要讲的要点是 ...

  6. java jax-rs_在Java EE 7和WildFly中使用Bean验证来验证JAX-RS资源数据

    java jax-rs 我过去已经两次接触过这个主题. 首先,在我的文章< 在Java EE 6中将Bean验证与JAX-RS集成>中 ,描述了甚至在Java EE平台规范中尚未定义之前, ...

  7. java jax-rs_在Java EE 6中将Bean验证与JAX-RS集成

    java jax-rs JavaBeans验证(Bean验证)是Java EE 6平台的一部分提供的新验证模型. 约束通过以JavaBeans组件(例如托管Bean)的字段,方法或类上的注释形式的约束 ...

  8. 在Java EE 7和WildFly中使用Bean验证来验证JAX-RS资源数据

    我过去已经两次接触过这个主题. 首先,在我的文章< 在Java EE 6中将Bean验证与JAX-RS集成>中 ,介绍了甚至在Java EE平台规范中未定义之前,如何在JBoss AS 7 ...

  9. 在Java EE 6中将Bean验证与JAX-RS集成

    JavaBeans验证(Bean验证)是一种新的验证模型,可作为Java EE 6平台的一部分使用. 约束条件支持Bean验证模型,该约束以注释的形式出现在JavaBeans组件(例如托管Bean)的 ...

最新文章

  1. 深入浅出解释FFT(一)——用fft求频谱
  2. 做为前端开发者,你应该要懂的 http协议
  3. 计算机体系结构:嵌入式方法_计科考研里的【计算机系统结构、计算机软件与理论、计算机应用技术】都是什么意思?...
  4. python编译exe文件太大了_python编译windows下可执行的exe文件
  5. JZOJ__DAY 4:【普及模拟】最大值
  6. 全套支付宝系统架构(内部架构图)【收藏】
  7. php 空模块,tp5.1配置空模块,空方法
  8. 2008年信息安全服务市场发展报告
  9. java重新开始循环_java for循环只进行第一次循环
  10. C++实现简单的文件I/O操作
  11. 二叉搜索树相关性质的应用
  12. 自动化部署之git merge和git rebase的区别
  13. 对讲机的单工、双工介绍
  14. 史上最全CAD快捷键大全汇总
  15. 什么是CPU Die?
  16. VMWare虚拟机处理器数量与每个处理器内核数量概念,以及分配CPU资源详解
  17. 【Linux】一步一步学Linux——VMware Workstation 15 Pro安装图解教程(06)
  18. 下载网易云音乐的MV
  19. 图像处理与机器视觉网络资源收罗——倾心大放送(转载)
  20. ubuntu22.04卡住死机并且键盘鼠标均无反应

热门文章

  1. JavaFX UI控件教程(二)之JavaFX UI控件
  2. Java 10的10个新特性,将彻底改变你写代码的方式
  3. 数据结构(一)之链表
  4. java之String
  5. 当你左右看看没有发现我时,千万千万别往看……
  6. Servlet 参数读取
  7. java后台手动分页
  8. 2018蓝桥杯省赛---java---B---2(方格计数)
  9. Redis非阻塞I/O多路复用机制
  10. mybatisplus 强制制空 空覆盖原来的字符串