`
zhchx0827
  • 浏览: 194086 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

hibernate validate实际应用

 
阅读更多

1:于struts结合

1.1:下载struts2-fullhibernatecore-plugin-2.2.2(目前最新的是2.2.2),

     它支持的hibernate    validate中,最新的版本是4.0.2,也是使用这个版本的原因

1.2struts配置文件中,包继承hibernate-default(需要同时继承多个包时,先后顺序对校验有影响)

<package name="recevaccount" extends="default,hibernate-default" namespace="">

1.3action的属性上添加约束

@not null

private String name;

  

对一个对象的校验,需要使用Valid,它会校验Emp对象中的约束

@Valid

private Emp emp;

 

也可以添加自定义约束

@MyOwnValid

private User user;

1.4:校验不通过时,错误信息会由struts2-fullhibernatecore-plugin插件放入Actionfielderroractionerror中。

     前台使用struts标签传递数据时:<s:textfield>,错误信息存放在fielderroractionerror

     前台使用一般的html表单时:<input>,错误信息存放在fielderror中。

1.5:如1.3所示,假如Emp10个字段,全部添加相应的约束,jsp传递到action中的参数只有emp.nameemp.id,则只会校验nameid上对应的约束,即:request parameter中的键所对应的约束。

 

 

 

2:校验的错误信息如何存入Action

1.3中的emp为例,前台通过emp.name,emp.age传递2个参数到后台,如果数据校验不通过,对应的错误信息存放在一个键值对中,键即是emp.name,emp.age;类约束默认存放在emp.null中。在所有属性都校验完之后,struts2-fullhibernatecore-plugin插件会遍历request.parameter中所有参数的键(这里是emp.nameemp.age),将错误信息存放到fielderroractionerror中。

所以,当类约束校验不通过时,由于没有从前台传递以emp.null为键的参数到后台,所以类约束的错误信息是没办法放入action中的。

 

 

3:如何指定错误信息对应的field

上面提到过,默认情况下类约束是没办法放入actionerror中的,所以即便校验不通过,也不会跳转到input页面。可以通过如下方式指定一个field来存放错误信息,但是该field必须要是前台传递到后台数据的键才行,原因可参考2.

//禁用默认

arg1.disableDefaultConstraintViolation();

arg1.buildConstraintViolationWithTemplate("错误信息").addNode("field").addConstraintViolation();

校验不通过后,类约束的错误信息将会放入emp.field中。

 

 

4:一个自定义类约束的例子

//该注解可以应用在:方法,域,注解类型上

@Target({ElementType.METHOD,ElementType.FIELD,ElementType.TYPE})

//注解在运行期通过反射读取

@Retention(RetentionPolicy.RUNTIME)

@Constraint(validatedBy = LeaveHourCheckValidator.class)

//在生成JavaDoc时,该注解会被添加到java文档中

@Documented

public @interface LeaveHourCheck {

  //定义错误消息

  String message() default "请假小时验证不通过";

  //定义所在的组

  Class<?>[] groups() default {};

  //定义级别条件的严重级别

  Class<? extends Payload>[] payload() default {};

}

 

//3.6版本和4.0有所不同

public class LeaveHourCheckValidator implements ConstraintValidator<LeaveHourCheck, HrLeave>{

    private LeaveService leaveService;

   

    public void initialize(LeaveHourCheck arg0) {

        WebApplicationContext wc = null;

        if (wc == null) {

            wc = WebApplicationContextUtils

                    .getRequiredWebApplicationContext(ServletActionContext

                            .getServletContext());

        }

        leaveService = wc.getBean(LeaveService.class);

    }

 

    public boolean isValid(HrLeave leave, ConstraintValidatorContext arg1) {

        ……………………

       

        //禁用默认

        arg1.disableDefaultConstraintViolation();

        arg1.buildConstraintViolationWithTemplate(message).addNode("hour").addConstraintViolation();

       

        return flag;

    }

}

 

 

 

5:同一个实体类的同一个field,不同操作进行不同的校验

假如有如下新需求,在保存时,年龄数必须小于20小时,修改时年龄必须大于25小时。由于在约束的Annotation中是没办法指定一个变量的,所以无法在使用约束时,通过参数进行区分。可以通过ActionContext.getContext().getName()获得Action的名字,不同的操作进行不同的校验

 

6:如何对数组对象进行校验

考虑如下情况:假如需要一次保存多个员工,前台通过js将数据封装成emp[0].name,emp[0].age,emp[1].name,emp[1].age……传递到后台,后台通过List<Emp> list进行接收,想通过hibernate validate进行校验,校验不通过时返回input页面。

假如我们使用默认情况:校验不通过时,错误信息存放在list.null中;指定一个field:校验不通过时,存放在list.field中。由此可见,没有哪一种情况对应的键出现在requestparameter中,所以错误信息无法放入Action中。

解决办法,在校验不通过时,自己手动将错误信息放入Action中,如下所示:

Object obj = ActionContext.getContext().getActionInvocation().getAction();

    if (!(obj instanceof ActionSupport)) {

         LOG.warn(obj.getClass().getPackage()+obj.getClass().getName() + "转换Action方法出错");

    }

ActionSupport support = (ActionSupport)obj;

 

 

 

 

 

 

 

 

另一种校验思路

上面的方法虽然可以有效的进行数据校验,将校验代码从Action中分离出来,但是不同的Action,不同的封装Bean需要不同的类约束(业务逻辑的需要,自带的约束远远不够用),这就导致了需要创建很多的自定义约束。到最后每个约束是干什么的自己都不清楚,维护起来也比较麻烦。可以通过如下方式解决。

 

1:自定义一个接口,所有的封装Bean都继承该接口。

public interface IValidate {

    public ReturnValue validate(RecevParameters parameter);

}

 

2:封装Bean,每个Bean,在自己的封装Bean中,写自己的校验方法。

public class RecevAccountBean implements IValidate {

……field……

 

……get,set……

 

    //========================进行数据校验=========================

    public ReturnValue validate(RecevParameters parameter) {

        String actionName = parameter.getActionName();

        if ("saveRecevAccountDeal".equals(actionName)) {

         

        }

        return null;

    }

}

 

3:自定义约束类,通过回调,每个封装Bean处理自己的校验,将错误信息封装成对象,统一返回到约束中进行处理。约束只对接口进行校验

@Target({ElementType.FIELD,ElementType.METHOD,ElementType.TYPE})

//注解在运行期通过反射读取

@Retention(RetentionPolicy.RUNTIME)

@Constraint(validatedBy = BeanCheckValidator.class)

//在生成JavaDoc时,该注解会被添加到java文档中

@Documented

public @interface BeanCheck {

    //定义错误消息

    String message() default "单据校验不通过";

    //定义所在的组

    Class<?>[] groups() default {};

    //定义级别条件的严重级别

    Class<? extends Payload>[] payload() default {};

}

 

 

public class BeanCheckValidator implements ConstraintValidator<BeanCheck, IValidate> {

    private BeanCheck check;

   

    public void initialize(BeanCheck constraintAnnotation) {

        this.check = constraintAnnotation;

    }

 

    public boolean isValid(IValidate validator, ConstraintValidatorContext context) {

        if (validator==null) {

            return true;

        }

 

        ActionContext actionContext = ActionContext.getContext();

        

        //存放Action的名字

        RecevParameters parameter = new RecevParameters();

        parameter.setActionName(actionContext.getName());

        parameter.setAnnotation(check);

       

        ReturnValue value = validator.validate(parameter);

       

        if (value==null || value.getErrors()==null) {

            return true;

        }

       

        boolean keepInAction = value.isKeepInAction();   //是否需要将错误信息存入ActionError

        boolean keepInField = value.isKeepInFields();    //是否需要将错误信息存入FieldError

        Map<String, String> map = value.getErrors();

       

        for (String string : value.getErrors().keySet()) {

            if(keepInAction) {

                ActionErrorUtil.addActionError(actionContext, map.get(string));

            }

            if(keepInField) {

                ActionErrorUtil.addFieldError(actionContext, string, map.get(string));

            }

        }

        return true;

    }

}

分享到:
评论

相关推荐

    hibernate validate 中文文档 英文文档

    8. 约束分组(Grouping constraints):在实际应用中,可能会希望一组约束条件仅在特定的操作或流程中被校验。约束分组允许开发者将约束条件组织到不同的分组中,在校验时选择性地应用这些分组。 9. 创建自定义约束...

    Maven+Spring MVC +Hibernate Validate

    综上所述,"Maven+Spring MVC +Hibernate Validate"项目结合了多种强大技术,构建了一个高效、健壮的Web应用解决方案,涵盖了项目管理、服务端控制、数据持久化、数据验证、前端交互以及文件处理等多个方面。...

    hibernate的校验框架validate后端验证

    Hibernate是Java领域中广泛应用的对象关系映射(ORM)框架,它提供了一套强大的数据验证工具——Hibernate Validator,这正是"hibernate的校验框架validate"的核心内容。本文将详细介绍Hibernate Validator及其在...

    springMVC+hibernateValidate

    在IT行业中,SpringMVC和Hibernate Validate是两个非常重要的组件,它们在开发企业级Web应用程序时发挥着关键作用。SpringMVC是Spring框架的一部分,它提供了模型-视图-控制器(MVC)架构,用于构建可维护、高性能的...

    springMVC整合hibernate的校验Validation

    在Spring MVC框架中整合Hibernate的校验机制,可以极大地提高我们开发Web应用的效率和代码质量。这主要是通过使用Hibernate Validator来实现数据的验证,它是一个遵循JSR 303(Java Bean Validation)和JSR 349...

    Hibernate 中配置C3P0连接池

    - `hibernate.c3p0.validate`: 是否在获取连接时验证其有效性,设置为`true`表示每次获取连接前都进行验证。 **3. 使用C3P0的优势** - **连接复用**:减少创建和销毁连接的开销,提高系统性能。 - **自动管理**:...

    Hibernate四大属性

    Hibernate是Java领域中一款广泛应用的关系对象映射框架,它极大地简化了数据库操作。"Hibernate四大属性"是指在配置Hibernate时,我们经常会遇到的四个关键属性,它们对于理解Hibernate的工作原理和优化数据库操作至...

    jqueryvalidate(猫冬)+spring3.0+struts2.18+hibernate3整合资源包

    综上所述,这个资源包提供了一个完整的Java Web开发示例,展示了如何将jQuery Validate与Spring、Struts和Hibernate进行集成,以构建一个具备用户认证功能的Web应用程序。对于初学者或者希望了解这些技术如何协同...

    Hibernate核心配置文件对照表

    Hibernate是Java领域中一款广泛应用的关系对象映射框架,它允许开发者将数据库操作抽象化,以对象的方式进行处理,极大地简化了数据库编程。`hibernate.properties`是Hibernate的核心配置文件,用于设定与数据库连接...

    hibernate--5.Hibernate配置文件详解-2

    理解并正确配置这些参数是使用Hibernate成功连接数据库、优化性能和确保应用程序正常运行的基础。而文件`0000.sql`可能是包含数据库脚本的文件,用于初始化数据库结构,与配置文件配合使用,确保数据库与实体类的...

    hibernate-validator.rar

    《Hibernate Validator 深度解析与应用实践》 Hibernate Validator 是一个基于 Java Bean Validation 规范的开源验证框架,它是 Hibernate 项目的一部分,主要用于在 Java 应用程序中实现数据校验。本篇文章将深入...

    hibernate-validator-5.0.0.CR2-dist.zip

    在实际应用中,我们还可以使用`Validator`接口来执行验证,例如: ```java ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); Validator validator = factory.getValidator(); Set...

    hibernate 配置 C3P0 连接池

    通过合理的配置,C3P0能够根据应用的实际需求动态调整连接池的大小,确保在不同负载情况下都能提供最佳的响应速度。 接下来,我们将详细介绍如何在Hibernate中配置C3P0连接池,包括配置文件的修改以及关键参数的...

    Hibernate参数设置一览表

    本篇文章将详细阐述Hibernate中的主要参数设置,帮助开发者更好地理解和配置Hibernate应用。 1. **hibernate.dialect** 这个参数定义了数据库方言,决定了Hibernate如何生成SQL语句。例如,如果你使用的是MySQL,...

    hibernate-validator-5.2.4

    Hibernate Validator提供了丰富的内置验证注解,例如`@NotNull`、`@NotEmpty`、`@Size`、`@Min`、`@Max`等,这些注解可以直接应用到bean的字段上,简化了代码并提高了可读性。此外,它还支持自定义验证注解和消息,...

    validate

    在实际应用中,我们可能还会看到异常处理机制,当验证失败时抛出异常并提供有意义的错误信息。 工具方面,开发人员可能使用自动化测试工具(如JUnit、TestNG)来验证程序的各个部分是否按预期工作。此外,静态代码...

    HIBERNATE:Hibernate 学习一--注解方式自动建表

    在提供的压缩包`test_java_hibernate`中,可能包含了示例代码,如实体类、配置文件、测试类等,用于演示上述概念的实际应用。读者可以通过阅读和运行这些代码,更深入地理解Hibernate的注解方式自动建表功能。

    validate-api工具类校验类属性所需jar包集合

    validate-api工具类主要被用于Java应用中的数据校验,它基于JSR 303(Bean Validation)和JSR 349(Bean Validation 1.1)标准,提供了对对象属性的有效性验证功能。这个工具类的正常运行依赖于一系列的jar包,这些...

    springboot-validate

    `SpringBoot validate`指的是Spring Boot集成Hibernate Validator进行参数验证的功能。Hibernate Validator是JSR-303/JSR-349标准的参考实现,提供了一种在Java应用中进行数据校验的优雅方式。 ** Hibernate ...

    spring3.x对应的validate全包

    `supports`方法用于确定验证器是否能处理特定类型的对象,而`validate`方法则执行实际的验证逻辑。此外,也可以使用`@Valid`注解在服务层的方法参数上,来触发级联验证。 在`文档.doc`中,可能包含了关于如何配置和...

Global site tag (gtag.js) - Google Analytics