HibernateClassValidator实例

Hibernate有很多值得学习的地方,这里我们主要介绍Hibernate ClassValidator实例,包括介绍Spring MVC 控制器使用的 CreditCardValidator等方面。

让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:主机域名虚拟主机、营销软件、网站建设、衡南网站维护、网站推广。

创建一个Hibernate ClassValidator实例

这个类进行实例化的代价可能会很高,因此最好只对希望进行验证的每个类来进行实例化。一种方法是创建一个实用工具类,对每个模型对象存储一个Hibernate ClassValidator实例,如下所示:

处理验证的实用工具类

 
 
 
  1. /**
  2. * Handles validations based on the Hibernate Annotations Validator framework.
  3. * @author Ted Bergeron
  4. * @version $Id: AnnotationValidator.java,v 1.5 2006/01/20 17:34:09 ted Exp $
  5. */
  6. public class AnnotationValidator {
  7. private static Log log = LogFactory.getLog(AnnotationValidator.class);
  8. // It is considered a good practice to execute these lines once and 
  9. // cache the validator instances.
  10. public static final ClassValidator CUSTOMER_VALIDATOR =
  11. new ClassValidator(Customer.class);
  12. public static final ClassValidator CREDIT_CARD_VALIDATOR =
  13. new ClassValidator(CreditCard.class);
  14. private static ClassValidator extends BaseObject> getValidator(Class 
  15. extends BaseObject> clazz) {
  16. if (Customer.class.equals(clazz)) {
  17. return CUSTOMER_VALIDATOR;
  18. }
  19. else if (CreditCard.class.equals(clazz)) {
  20. return CREDIT_CARD_VALIDATOR;
  21. }
  22. else {
  23. throw new IllegalArgumentException("Unsupported class was passed.");
  24. }
  25. }
  26. public static InvalidValue[] getInvalidValues(BaseObject modelObject) {
  27. String nullnullProperty = null;
  28. return getInvalidValues(modelObject, nullProperty);
  29. }
  30. public static InvalidValue[] getInvalidValues(BaseObject modelObject,
  31. String property) {
  32. Class extends BaseObject>clazz = modelObject.getClass();
  33. ClassValidator validator = getValidator(clazz);
  34. InvalidValue[] validationMessages;
  35. if (property == null) {
  36. validationMessages = validator.getInvalidValues(modelObject);
  37. }
  38. else {
  39. // only get invalid values for specified property.
  40. // For example, "city" applies to getCity() method.
  41. validationMessages = validator.getInvalidValues(modelObject, property);
  42. }
  43. return validationMessages;
  44. }
  45. }

创建了两个Hibernate ClassValidator,一个用于 Customer,另外一个用于 CreditCard。这两个希望进行验证的类可以调用 getInvalidValues(BaseObject modelObject),会返回 InvalidValue[]。这则会返回一个包含模型对象实例错误的数组。另外,这个方法也可以通过提供一个特定的属性名来调用,这样做会只返回与该域有关的错误。

在使用 Spring MVC 和 Hibernate Validator 时,为信用卡创建一个验证过程变得非常简单,如下所示:

Spring MVC 控制器使用的 CreditCardValidator

 
 
 
  1. /**
  2. * Performs validation of a CreditCard in Spring MVC.
  3. *
  4. * @author Ted Bergeron
  5. * @version $Id: CreditCardValidator.java,v 1.2 2006/02/10 21:53:50 ted Exp $
  6. */
  7. public class CreditCardValidator implements Validator {
  8. private CreditCardService creditCardService;
  9. public void setCreditCardService(CreditCardService service) {
  10. this.creditCardService = service;
  11. }
  12. public boolean supports(Class clazz) {
  13. return CreditCard.class.isAssignableFrom(clazz);
  14. }
  15. public void validate(Object object, Errors errors) {
  16. CreditCard creditCard = (CreditCard) object;
  17. InvalidValue[] invalids = AnnotationValidator.getInvalidValues(creditCard);
  18. // Perform "expensive" validation only if no simple errors found above.
  19. if (invalids == null || invalids.length == 0) { 
  20. boolean validCard = creditCardService.validateCreditCard(creditCard);
  21. if (!validCard) {
  22. errors.reject("error.creditcard.invalid");
  23. }
  24. }
  25. else {
  26. for (InvalidValue invalidValue : invalids) {
  27. errors.rejectValue(invalidValue.getPropertyPath(), 
  28. null, invalidValue.getMessage());
  29. }
  30. }
  31. }
  32. }

validate() 方法只需要将 creditCard 实例传递给这个验证过程,从而返回 InvalidValue 数组。如果发现了一个或多个这种简单错误,那么就可以将 Hibernate 的 InvalidValue 数组转换成 Spring 的 Errors 对象。如果用户已经创建了这个信用卡并且没有出现任何简单错误,就可以将更加彻底的验证委托给服务层进行。这一层可以与商业服务提供者一起对信用卡进行验证。

现在我们已经看到这个简单的模型层注释是如何平衡到控制器、DAO 和 DBMS 层的验证的。在 Hibernate Doclet 和 Commons Validator 中发现的验证逻辑的重合现在都已经统一到模型中了。尽管这是一个非常受欢迎的改进,但是视图层传统上来说一直是最需要进行详细验证的地方。

当前文章:HibernateClassValidator实例
新闻来源:http://www.shufengxianlan.com/qtweb/news11/500361.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联