约束条件组合--把多个约束组合成一个约束

上一节中我们自定义的@CheckCase是用来检查是否String为大写的注释,默认情况下当我们的String为null的时候也被认为正确的

CaseMode枚举

  1. package test02;
  2.  
  3. public enum CaseMode {
  4. UPPER,
  5. LOWER;
  6. }

User类

  1. package test02;
  2.  
  3. public class User {
  4. @CheckCase(value=CaseMode.UPPER)
  5. private String name;
  6.  
  7. // @CheckCase(CaseMode.UPPER)
  8. // private String email="email";
  9. }

@CheckCase

  1. package test02;
  2.  
  3. import static java.lang.annotation.ElementType.*;
  4. import static java.lang.annotation.RetentionPolicy.*;
  5. import java.lang.annotation.Documented;
  6. import java.lang.annotation.Retention;
  7. import java.lang.annotation.Target;
  8. import javax.validation.Constraint;
  9. import javax.validation.Payload;
  10. @Target({METHOD, FIELD, ANNOTATION_TYPE })
  11. @Retention(RUNTIME)
  12. @Constraint(validatedBy = CheckCaseValidator.class)
  13. @Documented
  14. public @interface CheckCase {
  15. String message() default "{test02.CheckCase.message}";
  16. Class<?>[] groups() default {};
  17. Class<? extends Payload>[] payload() default {};
  18. CaseMode value();
  19.  
  20. }

验证器

  1. package test02;
  2.  
  3. import javax.validation.ConstraintValidator;
  4. import javax.validation.ConstraintValidatorContext;
  5.  
  6. public class CheckCaseValidator implements ConstraintValidator<CheckCase, String> {
  7. private CaseMode caseMode;
  8.  
  9. public void initialize(CheckCase constraintAnnotation) {
  10. this.caseMode = constraintAnnotation.value();
  11. }
  12.  
  13. public boolean isValid(String object, ConstraintValidatorContext constraintContext) {
  14. if (object == null)
  15. return true;
  16. boolean isValid;
  17. if (caseMode == CaseMode.UPPER) {
  18. isValid = object.equals(object.toUpperCase());
  19. } else {
  20. isValid = object.equals(object.toLowerCase());
  21. }
  22. // if(!isValid) {
  23. // constraintContext.disableDefaultConstraintViolation();
  24. // constraintContext.buildConstraintViolationWithTemplate( "{com.mycompany.constraints.CheckCase.message}" ).addConstraintViolation();
  25. // }
  26. return isValid;
  27. }
  28. }

运行结果:

  1. @Test
  2. public void test01(){
  3. User u=new User();
  4. Set<ConstraintViolation<User>> validate = validator.validate(u);
  5. System.out.println(validate.size());
  6. //
  7. System.out.println(validate);
  8. //[]
  9. }

所以这一节我们将该注释和@notNull的注释组合起来

一,创建一个约束条件组合 @UpperNotNull

  1. package test03;
  2. import static java.lang.annotation.ElementType.*;
  3. import static java.lang.annotation.RetentionPolicy.*;
  4. import java.lang.annotation.Documented;
  5. import java.lang.annotation.Retention;
  6. import java.lang.annotation.Target;
  7.  
  8. import javax.validation.Constraint;
  9. import javax.validation.Payload;
  10. import javax.validation.constraints.NotNull;
  11.  
  12. import test02.CheckCase;
  13. import test02.CaseMode;
  14.  
  15. @NotNull
  16. @CheckCase(CaseMode.UPPER)
  17. @Target( { METHOD, FIELD, ANNOTATION_TYPE })
  18. @Retention(RUNTIME)
  19. @Constraint(validatedBy = {})
  20. @Documented
  21. public @interface UpperNotNull {
  22. String message() default "{com.mycompany.constraints.validlicenseplate}";
  23. Class<?>[] groups() default {};
  24. Class<? extends Payload>[] payload() default {};
  25.  
  26. }
  1. package test02;
  2.  
  3. import static java.lang.annotation.ElementType.*;
  4. import static java.lang.annotation.RetentionPolicy.*;
  5. import java.lang.annotation.Documented;
  6. import java.lang.annotation.Retention;
  7. import java.lang.annotation.Target;
  8. import javax.validation.Constraint;
  9. import javax.validation.Payload;
  10. @Target({METHOD, FIELD, ANNOTATION_TYPE })
  11. @Retention(RUNTIME)
  12. @Constraint(validatedBy = CheckCaseValidator.class)
  13. @Documented
  14. public @interface CheckCase {
  15. String message() default "{test02.CheckCase.message}";
  16. Class<?>[] groups() default {};
  17. Class<? extends Payload>[] payload() default {};
  18. CaseMode value();
  19.  
  20. }

属性文件中的内容

  1. test02.CheckCase.message = must be false {value}
  2. com.mycompany.constraints.validlicenseplate=must not be null and must be Upper writen

二,创建Po测试类

  1. package test03;
  2.  
  3. public class User {
  4. @UpperNotNull
  5. private String name;
  6.  
  7. // @CheckCase(CaseMode.UPPER)
  8. // private String email="email";
  9. }

三,测试

  1. package test03;
  2.  
  3. import java.util.Set;
  4.  
  5. import javax.validation.ConstraintViolation;
  6. import javax.validation.Validation;
  7. import javax.validation.Validator;
  8. import javax.validation.ValidatorFactory;
  9. import org.junit.BeforeClass;
  10. import org.junit.Test;
  11. public class MyTest {
  12.  
  13. private static Validator validator;
  14.  
  15. /**
  16. * 获取一个验证器
  17. */
  18. @BeforeClass
  19. public static void setUp() {
  20. ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
  21. validator = factory.getValidator();
  22. }
  23. @Test
  24. public void test01(){
  25. User u=new User();
  26. Set<ConstraintViolation<User>> validate = validator.validate(u);
  27. System.out.println(validate.size());
  28. //
  29. System.out.println(validate);
  30. //[ConstraintViolationImpl{interpolatedMessage='不能为null', propertyPath=name, rootBeanClass=class test03.User, messageTemplate='{javax.validation.constraints.NotNull.message}'}]
  31. }
  32.  
  33. }

当我们把Po类中的name改成:

  1. package test03;
  2.  
  3. public class User {
  4. @UpperNotNull
  5. private String name="wangyang";
  6.  
  7. // @CheckCase(CaseMode.UPPER)
  8. // private String email="email";
  9. }

再测试:

  1. @Test
  2. public void test01(){
  3. User u=new User();
  4. Set<ConstraintViolation<User>> validate = validator.validate(u);
  5. System.out.println(validate.size());
  6. //
  7. System.out.println(validate);
  8. //[ConstraintViolationImpl{interpolatedMessage='must be false UPPER', propertyPath=name, rootBeanClass=class test03.User, messageTemplate='{test02.CheckCase.message}'}]
  9. }

hibernate_validator_10的更多相关文章

随机推荐

  1. C++ STL的各种实现版本

    ANSI/ISO的C++ STL规范版本正式通过以后,各个C++编译器厂商就可以依照标准所描述的原型去实现C++ STL泛型库,于是出现多种符合标准接口,但具体实现代码不同的泛型库,主要有: HP S ...

  2. AlgorithmsI PA2: Randomized Queues and Deques Subset

    本题的bonus是 因此方法是queue的size 达到了K, 就停止增加元素,保证queue.size() 最大时只有k. Java code: import edu.princeton.cs.al ...

  3. zoj3229 Shoot the Bullet(有源汇有上下界的最大流)

    题意: 一个屌丝给m个女神拍照,计划拍照n天,每一天屌丝给给定的C个女神拍照,每天拍照数不能超过D张,而且给每个女神i拍照有数量限制[Li,Ri],对于每个女神n天的拍照总和不能少于Gi,如果有解求屌 ...

  4. ♫【HTML5 敏捷实践】第1章 使用语义化的方式实现

    <!DOCTYPE html> 向后兼容的HTML5<doctype>标签.HTML5规范规定<doctype>对大小写不敏感:然而,之前版本的HTML需要< ...

  5. (转载)PHP中刷新输出缓冲

    (转载)http://www.cnblogs.com/mutuan/archive/2012/03/18/2404957.html PHP中刷新输出缓冲buffer是一个内存地址空间,Linux系统默 ...

  6. C#代码实现隐藏任务栏、开始菜单和禁用任务管理

    一:截图,主要是调用系统接口和更改注册表实现功能 二:代码 using System; using System.Collections.Generic; using System.Linq; usi ...

  7. Validate Binary Search Tree——LeetCode

    Given a binary tree, determine if it is a valid binary search tree (BST). Assume a BST is defined as ...

  8. 手机app

    手机app是什么? 由于iPhone.三星等智能手机的逐步流行和广泛普及,手机app这个词语开始频繁的出现在广大手机网民的视线中.也许你们还不知道什么是手机app,但你一定下载过手机app,你的手机里 ...

  9. python关键字、转义符和字符串格式化

    最近在学learn python the hard way,学习到第37章,进行了关于关键字.转义符和字符串格式化的总结.看手头上的中文版没有及时更新.于是就把这些翻译过来,以作查阅. 关键字: 关键 ...

  10. python 解析xml 文件: SAX方式

    环境 python:3.4.4 准备xml文件 首先新建一个xml文件,countries.xml.内容是在python官网上看到的. <?xml version="1.0" ...