`
Fly_m
  • 浏览: 260090 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

使用hibernate validator进行数据的统一保存和更新信息验证

阅读更多

本文主要考虑对于bean validator的统一化定制,重点在于思路,而不在于实现,所以在实现过程中有不完整的地方请谅解

 

 

    关于hibernate validator,距4.0发布到现在已经快2年了,它是属于jsr 303的一部分,即Bean Validator。在开发过程中,经常会对输入的数据进行验证,不同的框架有不同的验证方式,可以在每个需要验证的地方进行验证,也可以使用统一的验证方式进行工作。显然使用统一的方式进行验证很有吸引力,特别是对于在进行数据的save和update时,经常会使用相同的验证逻辑以及各种重复的代码进行验证,如果能进行统一化调用,则能够减少一大段的使用代码,提高开发效率。

 

    首先,我们来看一个原来的验证方式,如下面的代码,这们需要对user对象的username和password进行验证,如下所示:

 

Asserts.assertTrue(StringUtils.hasText(getPassword()), Message.createMessage("user.password.empty"));
Asserts.assertTrue(StringUtils.hasText(getUsername()), Message.createMessage("user.username.empty"));

    上面的代码,也已经是很简练的代码了,然而也需要写两行,加上其它的验证。光数据验证就得有一大段代码。然而,不幸的是,这段代码将在进行user对象的更新时,又写一次。因为,不能保证在进行更新时会使用和添加相同的逻辑,但总有大部分是相同的,这就不能避免同样的代码编写两次。
    好了,当使用统一化的验证之后,代码变成如下形式:

validateBeanAdd();//这是对象添加验证
validateBeanUpdate(other);//这是对象更新验证

     大部分(不是全部,因为与业务相关逻辑不能统一化)的验证逻辑都使用统一验证来代替了。所有的魔法都在于如何使用hibernate validator(以下使用jsr303代替)以及相应的分组验证,并将其整合到代码中。

 

    首先,我们来确认验证时需要的元素信息

  1.     验证哪些信息(字段)
  2.     验证失败时的错误信息
  3.     什么时候需要验证

    幸运地是,在jsr303中,以上的3个信息均有相应的对象。其中错误信息可以通过message来指定,而不同的验证条件则可以通过group分组进行划分。那么,统一验证的逻辑可以由如下描述:

  1.     对象保存时进行以保存为分组的验证条件进行验证
  2.     对象更新时进行以更新为分组的验证条件进行验证

@Column(unique = true, updatable = false, nullable = false)

    那么,由上所示,修改后的user对象,可以这样来编写:

        @NotNull(message="用户名不能为空", groups={Groups.Add.class,Groups.Update.class}
    public String getUsername() {
        return username;
    }
 
    @Column(name = "f_password")
        @NotNull(message="密码不能为空", groups={Groups.Add.class,Groups.Update.class}
    public String getPassword() {
        return password;
    }

      在添加时,统一的验证即validateBeanAdd,即可以这样来编写:

 

protected final void validateBeanAdd() {
        //使用validator进行判断
        List<String> strList = ValidateUtils.validateBean(this, Groups.Add.class);
        Asserts.assertTrue(strList.isEmpty(), Joins.join(strList, null));
    }

     当然,用了以上方法之后,每次验证调用一次validateBeanAdd也是不允许的,那么,我们可以写一个公共的保存方法,在此方法中调用validateBeanAdd,子类只需要重新其中可扩展的部分即可。

 

    附:一个完整的实现,即User对象的save方法实现

    首先是BaseDomain的save方法:

 

//保存方法
@Transactional //需要domain层事务 rich domain
public void save() {
		//信息检查
		boolean canAdd = canAdd();
		Asserts.assertTrue(canAdd, getValidateMessage());
               session.save(this);//hibernate session
}
//验证是否能添加方法
	public boolean canAdd() {
		validateBeanAdd();
		message = validateAdd();
		return message == null || !message.hasErrorMessage();//兼容旧写法;
	}
//bean字段验证方法
protected final void validateBeanAdd() {
		//使用validator进行判断
		List<String> strList = ValidateUtils.validateBean(this, Groups.Add.class);
		Asserts.assertTrue(strList.isEmpty(), Joins.join(strList, null));
	}
//bean字段验证实现
	public static List<String> validateBean(Entityable entityable, ValidateMessageFunction<String, String> function, Class<?> group) {
		Set<ConstraintViolation<Entityable>> constraintViolationSet = validator.validate(entityable, group);
		if(constraintViolationSet.isEmpty())
			return Collections.emptyList();
		List<String> validateList = Lists.newArrayList();
		for(ConstraintViolation<Entityable> constraintViolation : constraintViolationSet) {
			String message = constraintViolation.getMessage();
			message = function == null ? message : function.apply(field, message);
			validateList.add(message);
		}
		return validateList;
	}

 

 

    子类User只需要实现validateAdd即可,如下所示:public Message validateAdd() {

//业务逻辑验证,用户名惟一
		if( hasUsername(getUsername()))
			return Message.createMessage("user.username.exist", getUsername());
}
 

    以上是一个参考实现,对于其它类,如基础数据的保存和修改,完全可以使用以上的方法,在实现中,只需要实现validateAdd即可,不用写save,在Action层只需要调用domain.save()即可,减少开发代码。

 

     本文原自:http://www.iflym.com/index.php/code/201109070002.html 此处,增加具体的参考示例,希望对大家有所帮助。

分享到:
评论

相关推荐

    java 利用POI对Execel表格的统一导入与校验(利用Hibernate Validator)

    通过上述解释,我们可以看出,Java利用Apache POI和Hibernate Validator进行Excel表格的统一导入与校验,既简化了开发工作,又提高了数据处理的准确性和灵活性。这样的解决方案在大数据处理、报表导入等场景下具有...

    hibernate_validator5.0 中文文档

    Hibernate Validator 5原生支持JPA 2.0和JSF 2,这意味着在使用这些技术栈时,可以直接利用Hibernate Validator来进行数据验证,无需额外编写复杂的验证逻辑。 #### 三、使用指南 ##### 3.1 定义约束 在Hibernate...

    hibernate校验jar包

    使用这三个jar包,开发者可以在保存数据之前,通过调用Hibernate提供的验证方法,检查模型对象是否满足预设的验证规则。例如,可以确保必填字段不为空,字符串长度在指定范围内,或者日期格式正确等。如果数据不符合...

    springmvc验证需要的jar

    Spring MVC与Hibernate Validator结合使用,可以方便地在服务层或者控制器层对模型对象进行验证。 3. **Spring Validation Support**: Spring MVC框架提供了`@Valid`注解,用于在控制器方法参数上触发验证。此外...

    Hibernate框架需要的所有jar包

    通过这个库,开发者可以使用Hibernate提供的Session接口来与数据库进行交互,进行对象的保存、更新、删除和查询等操作。 其次,`hibernate-entitymanager.jar`提供了JPA(Java Persistence API)的支持。JPA是Java ...

    Bean Validator JSR303

    此外,Spring Data JPA的`Repository`接口也支持直接在保存或更新操作中应用验证。 ### 5. 自定义验证注解和验证器 当预定义的注解无法满足需求时,开发者可以创建自己的验证注解和对应的验证器。验证器通常需要...

    Hibernate3.6相关Jar包和说明Pdf

    4. **Cascading(级联操作)**:允许一个对象的操作影响到与之关联的对象,如保存、删除和更新。 5. **Transactions(事务处理)**:支持JTA(Java Transaction API),确保数据操作的原子性、一致性、隔离性和持久...

    springmvc和mybatis整合包括json和validator 和文件上传所需所有jar包

    在这个过程中,JSON处理和Validator数据校验以及文件上传功能也是必不可少的组成部分。下面我们将详细讨论这些知识点。 1. **Spring MVC**: - **核心组件**:DispatcherServlet是Spring MVC的入口,负责接收请求...

    MethodLevelValidation.zip

    SpringMVC使用了JSR 303(JavaBean Validation)规范,它的升级版JSR 349提供了统一的数据验证接口。我们可以通过在实体类的属性上添加如`@NotNull`、`@Size`等注解来设定验证规则。 3. **@Validated注解** 在...

    GooodsShop02.7z

    在电商项目中,用户信息的快速读取和更新至关重要。使用Redis存储用户信息,可以提高查询速度,减轻数据库压力。此外,Redis支持多种数据结构,如字符串、哈希、列表、集合和有序集合,使得用户信息的管理更加灵活。...

    ssh框架增删改查+图片上传案例

    Hibernate提供了Session接口,用于保存、查询和更新数据库中的数据。 在"ssh框架增删改查+图片上传案例"中,你将会看到以下关键知识点: 1. **配置文件**:包括struts.xml、spring配置文件(如applicationContext....

    J2EE软件工程师内部培训资料

    - **操作持久化对象**:演示如何使用Hibernate API来保存、更新、删除和检索对象。 - **事务,并发**:探讨如何在Hibernate中管理事务,并解决并发问题。 - **高级映射概念**:介绍更复杂的映射策略,如继承映射和...

    Spring Live中文

    - 使用commons-validator库来添加客户端和服务器端的数据验证逻辑。 - 常见的验证规则包括非空检查、格式验证等。 **在struts-config.xml中添加ValidatorPlugin:** - 在Struts配置文件中添加验证插件(Validator ...

    spring web flow 2

    8. **验证(Validation)**:集成Hibernate Validator或JSR-303 Bean Validation,实现表单数据的验证,确保输入的有效性。 9. **异常处理(Exception Handling)**:通过定义异常策略,Spring Web Flow可以优雅地...

    J2EE课程总结

    - AJAX是一种使用JavaScript异步与服务器交换数据的技术,可以在不重新加载整个页面的情况下更新部分网页内容。 #### JavaScript **1. 概述** - JavaScript是一种解释型或即时编译型的编程语言,常用于网页开发。 ...

    Struts中文文档

    2. Validator验证框架:对用户输入进行校验,确保数据的正确性。 3. Internationalization(国际化):支持多语言环境,方便全球化部署。 4. Exception Handling(异常处理):提供统一的异常处理机制,增强程序健壮...

    J2EE软件工程师全部培训课程总结

    - **Struts的 validator 验证框架**:用于客户端和服务端的验证。 #### JSF (JavaServer Faces) - **JSF介绍**:一种基于组件的MVC框架。 - **JSF页面导航**:用于控制页面间的跳转。 - **JSF简单工作流程及简单...

    SpringBootJSR303:带有 JSR 303 的 Spring Boot 应用程序 - 独立应用程序的 Bean Validation 1.1

    而JSR 303(Bean Validation)是Java平台上的一个标准,用于进行对象级别的验证,提供了对数据模型验证的统一框架。在Spring Boot项目中集成JSR 303,可以使得业务逻辑中的数据验证变得更加规范和便捷。 ### 1. ...

Global site tag (gtag.js) - Google Analytics