当前位置: 代码迷 >> Web前端 >> Hibernate-Validation的施用
  详细解决方案

Hibernate-Validation的施用

热度:638   发布时间:2012-09-11 10:49:03.0
Hibernate-Validation的使用

以前弄过hibernate-validation的,可今天想用一下的时候发现某些东西自己又忘了,于是又重新整理了下,并做了点实验:

首先是要加入下面两个包

hibernate-validator-4.1.0.Final.jar
?validation-api-1.0.0.GA.jar

?

如果在验证不通过的时候进行了添加、更新或删除操作的时候,则会抛出javax.validation.ConstraintViolationException异常

下面是测试用的类

?

Model2:

Java代码 ?收藏代码
  1. import ?javax.persistence.Entity;??
  2. import ?javax.persistence.GeneratedValue;??
  3. import ?javax.persistence.GenerationType;??
  4. import ?javax.persistence.Id;??
  5. import ?javax.persistence.ManyToOne;??
  6. import ?javax.persistence.Table;??
  7. import ?javax.persistence.TableGenerator;??
  8. import ?javax.validation.Valid;??
  9. import ?javax.validation.constraints.Max;??
  10. import ?javax.validation.constraints.Min;??
  11. import ?javax.validation.constraints.NotNull;??
  12. import ?javax.validation.constraints.Size;??
  13. ??
  14. import ?org.hibernate.validator.constraints.Email;??
  15. import ?org.hibernate.validator.constraints.URL;??
  16. ??
  17. @Entity ??
  18. @Table (name= "t_Model2" )??
  19. @TableGenerator (name= "mytable" ,initialValue= 1 ,allocationSize= 1 )??
  20. public ? class ?Model2?{??
  21. ??
  22. ????private ? int ?id;??
  23. ????private ?String?name;??
  24. ????private ?String?address;??
  25. ????private ?String?phoneNumber;??
  26. ????private ?String?email;??
  27. ????private ? int ?age;??
  28. ????private ?Model3?model3;??
  29. ????private ?String?url;??
  30. ??
  31. ????@Id ??
  32. ????@GeneratedValue (generator= "mytable" ,strategy=GenerationType.TABLE)??
  33. ????public ? int ?getId()?{??
  34. ????????return ?id;??
  35. ????}??
  36. ??
  37. ????public ? void ?setId( int ?id)?{??
  38. ????????this .id?=?id;??
  39. ????}??
  40. ??
  41. ????@NotNull (message= "姓名不能为空!" )??
  42. ????public ?String?getName()?{??
  43. ????????return ?name;??
  44. ????}??
  45. ??
  46. ????public ? void ?setName(String?name)?{??
  47. ????????this .name?=?name;??
  48. ????}??
  49. ??
  50. ????@NotNull (message= "地址不能为空!" )??
  51. ????public ?String?getAddress()?{??
  52. ????????return ?address;??
  53. ????}??
  54. ??
  55. ????public ? void ?setAddress(String?address)?{??
  56. ????????this .address?=?address;??
  57. ????}??
  58. ??
  59. ????@Size (max= 11 ,min= 11 ,message= "长度只能为11位!" )??
  60. ????public ?String?getPhoneNumber()?{??
  61. ????????return ?phoneNumber;??
  62. ????}??
  63. ??
  64. ????public ? void ?setPhoneNumber(String?phoneNumber)?{??
  65. ????????this .phoneNumber?=?phoneNumber;??
  66. ????}??
  67. ??
  68. ????@Email (message= "email地址无效!" )??
  69. ????@NotNull (message= "email地址不能为空!" )??
  70. ????public ?String?getEmail()?{??
  71. ????????return ?email;??
  72. ????}??
  73. ??
  74. ????public ? void ?setEmail(String?email)?{??
  75. ????????this .email?=?email;??
  76. ????}??
  77. ??
  78. ????@NotNull (message?=? "Model3不能为空!" )??
  79. ????@Valid ??
  80. ????@ManyToOne ??
  81. ????public ?Model3?getModel3()?{??
  82. ????????return ?model3;??
  83. ????}??
  84. ??
  85. ????public ? void ?setModel3(Model3?model3)?{??
  86. ????????this .model3?=?model3;??
  87. ????}??
  88. ??
  89. ????@Min (value= 18 ,message= "必须年满18岁!" )??
  90. ????@Max (value= 30 ,message= "年龄不能大于30岁!" )??
  91. ????public ? int ?getAge()?{??
  92. ????????return ?age;??
  93. ????}??
  94. ??
  95. ????public ? void ?setAge( int ?age)?{??
  96. ????????this .age?=?age;??
  97. ????}??
  98. ??
  99. ????@URL (message= "无效的URL地址" )??
  100. ????@NotNull (message?=? "URL不能为空!" )??
  101. ????public ?String?getUrl()?{??
  102. ????????return ?url;??
  103. ????}??
  104. ??
  105. ????public ? void ?setUrl(String?url)?{??
  106. ????????this .url?=?url;??
  107. ????}??
  108. ??????
  109. }??

?Model3:

Java代码 ?收藏代码
  1. import ?javax.persistence.Entity;??
  2. import ?javax.persistence.GeneratedValue;??
  3. import ?javax.persistence.Id;??
  4. import ?javax.persistence.Table;??
  5. import ?javax.validation.constraints.NotNull;??
  6. ??
  7. @Entity ??
  8. @Table (name= "t_Model3" )??
  9. public ? class ?Model3?{??
  10. ??
  11. ????private ? int ?id;??
  12. ??????
  13. ????private ?String?name;??
  14. ??
  15. ????@Id ??
  16. ????@GeneratedValue ??
  17. ????public ? int ?getId()?{??
  18. ????????return ?id;??
  19. ????}??
  20. ??
  21. ????public ? void ?setId( int ?id)?{??
  22. ????????this .id?=?id;??
  23. ????}??
  24. ??
  25. ????@NotNull (message= "model3的名称不能为空!" )??
  26. ????public ?String?getName()?{??
  27. ????????return ?name;??
  28. ????}??
  29. ??
  30. ????public ? void ?setName(String?name)?{??
  31. ????????this .name?=?name;??
  32. ????}??
  33. ??????
  34. }??

?

Test类:

Java代码 ?收藏代码
  1. import ?org.springframework.context.ApplicationContext;??
  2. ??
  3. import ?com.tiantian.test.model.Model2;??
  4. import ?com.tiantian.test.service.Model2Service;??
  5. import ?com.tiantian.test20110430.util.Util;??
  6. ??
  7. public ? class ?Test1?{??
  8. ??
  9. ????public ? static ? void ?main(String?args[])?{??
  10. ????????ApplicationContext?context?=?Util.getContext();??
  11. ????????Model2Service?service?=?context.getBean(Model2Service.class );??
  12. ????????Model2?model?=?new ?Model2();??
  13. ????????model.setName("hello" );??
  14. ????????model.setEmail("testHibernateValidate@sohu.com" );??
  15. ????????model.setAddress("湖南长沙" );??
  16. ????????model.setPhoneNumber("15012345678" );??
  17. ??
  18. ????????String?result?=?Util.validateModel(model);//?返回的验证结果,验证结果就是一个字符串,如果有错误的话则该字符串的长度大于0 ??
  19. ????????System.out.println(result);??
  20. ????????if ?(result.length()?==? 0 ) //?验证不通过的时候就不添加 ??
  21. ????????????service.add(model);??
  22. ??
  23. ????}??
  24. ??
  25. }??

?

?上面用到的Util类:

Java代码 ?收藏代码
  1. import ?java.util.Iterator;??
  2. import ?java.util.Set;??
  3. ??
  4. import ?javax.validation.ConstraintViolation;??
  5. import ?javax.validation.Validation;??
  6. import ?javax.validation.Validator;??
  7. ??
  8. import ?org.springframework.context.ApplicationContext;??
  9. import ?org.springframework.context.support.ClassPathXmlApplicationContext;??
  10. ??
  11. public ? class ?Util?{??
  12. ??
  13. ????private ? static ?ApplicationContext?context?=? new ?ClassPathXmlApplicationContext( "applicationContext.xml" );??
  14. ??????
  15. ????public ? static ?ApplicationContext?getContext()?{??
  16. ????????return ?context;??
  17. ????}??
  18. ??????
  19. ????public ? static ?String?validateModel(Object?obj)?{ //验证某一个对象 ??
  20. ??????????
  21. ????????StringBuffer?buffer?=?new ?StringBuffer( 64 ); //用于存储验证后的错误信息 ??
  22. ??????????
  23. ????????Validator?validator?=?Validation.buildDefaultValidatorFactory()??
  24. ????????????????.getValidator();??
  25. ??
  26. ????????Set<ConstraintViolation<Object>>?constraintViolations?=?validator??
  27. ????????????????.validate(obj);//验证某个对象,,其实也可以只验证其中的某一个属性的 ??
  28. ??
  29. ????????Iterator<ConstraintViolation<Object>>?iter?=?constraintViolations??
  30. ????????????????.iterator();??
  31. ????????while ?(iter.hasNext())?{??
  32. ????????????String?message?=?iter.next().getMessage();??
  33. ????????????buffer.append(message);??
  34. ????????}??
  35. ????????return ?buffer.toString();??
  36. ????}??
  37. ??????
  38. }??

?

?

下面是一些主要的注解:

Java代码 ?收藏代码
  1. @AssertTrue ? //用于boolean字段,该字段只能为true ??
  2. @AssertFalse //该字段的值只能为false ??
  3. @CreditCardNumber //对信用卡号进行一个大致的验证 ??
  4. @DecimalMax //只能小于或等于该值 ??
  5. @DecimalMin //只能大于或等于该值 ??
  6. @Digits (integer= 2 ,fraction= 20 ) //检查是否是一种数字的整数、分数,小数位数的数字。 ??
  7. @Email //检查是否是一个有效的email地址 ??
  8. @Future //检查该字段的日期是否是属于将来的日期 ??
  9. @Length (min=,max=) //检查所属的字段的长度是否在min和max之间,只能用于字符串 ??
  10. @Max //该字段的值只能小于或等于该值 ??
  11. @Min //该字段的值只能大于或等于该值 ??
  12. @NotNull //不能为null ??
  13. @NotBlank //不能为空,检查时会将空格忽略 ??
  14. @NotEmpty //不能为空,这里的空是指空字符串 ??
  15. @Null //检查该字段为空 ??
  16. @Past //检查该字段的日期是在过去 ??
  17. @Size (min=,?max=) //检查该字段的size是否在min和max之间,可以是字符串、数组、集合、Map等 ??
  18. @URL (protocol=,host,port) //检查是否是一个有效的URL,如果提供了protocol,host等,则该URL还需满足提供的条件 ??
  19. @Valid //该注解只要用于字段为一个包含其他对象的集合或map或数组的字段,或该字段直接为一个其他对象的引用, ??
  20. ????????//这样在检查当前对象的同时也会检查该字段所引用的对象 ??

?


  相关解决方案