java bean 验证_Java Bean验证基础
java bean 驗證
這篇文章總結了一些簡單,快速的示例,這些示例說明了您想使用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捆綁在一起)
下載
訪問我的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 驗證
總結
以上是生活随笔為你收集整理的java bean 验证_Java Bean验证基础的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑系统无法加载进去(电脑出现无法加载)
- 下一篇: 安卓手机游戏吧(安卓游戏吧吧)