1:于struts结合
1.1:下载struts2-fullhibernatecore-plugin-2.2.2(目前最新的是2.2.2),
它支持的hibernate validate中,最新的版本是4.0.2,也是使用这个版本的原因
1.2:struts配置文件中,包继承hibernate-default(需要同时继承多个包时,先后顺序对校验有影响)
<package name="recevaccount" extends="default,hibernate-default" namespace="">
1.3:action的属性上添加约束
@not null
private String name;
对一个对象的校验,需要使用Valid,它会校验Emp对象中的约束
@Valid
private Emp emp;
也可以添加自定义约束
@MyOwnValid
private User user;
1.4:校验不通过时,错误信息会由struts2-fullhibernatecore-plugin插件放入Action的fielderror和actionerror中。
前台使用struts标签传递数据时:<s:textfield>,错误信息存放在fielderror和actionerror中
前台使用一般的html表单时:<input>,错误信息存放在fielderror中。
1.5:如1.3所示,假如Emp中10个字段,全部添加相应的约束,jsp传递到action中的参数只有emp.name,emp.id,则只会校验name和id上对应的约束,即:request parameter中的键所对应的约束。
2:校验的错误信息如何存入Action中
以1.3中的emp为例,前台通过emp.name,emp.age传递2个参数到后台,如果数据校验不通过,对应的错误信息存放在一个键值对中,键即是emp.name,emp.age;类约束默认存放在emp.null中。在所有属性都校验完之后,struts2-fullhibernatecore-plugin插件会遍历request.parameter中所有参数的键(这里是emp.name和emp.age),将错误信息存放到fielderror和actionerror中。
所以,当类约束校验不通过时,由于没有从前台传递以emp.null为键的参数到后台,所以类约束的错误信息是没办法放入action中的。
3:如何指定错误信息对应的field
上面提到过,默认情况下类约束是没办法放入action的error中的,所以即便校验不通过,也不会跳转到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中。由此可见,没有哪一种情况对应的键出现在request的parameter中,所以错误信息无法放入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;
}
}
分享到:
相关推荐
8. 约束分组(Grouping constraints):在实际应用中,可能会希望一组约束条件仅在特定的操作或流程中被校验。约束分组允许开发者将约束条件组织到不同的分组中,在校验时选择性地应用这些分组。 9. 创建自定义约束...
综上所述,"Maven+Spring MVC +Hibernate Validate"项目结合了多种强大技术,构建了一个高效、健壮的Web应用解决方案,涵盖了项目管理、服务端控制、数据持久化、数据验证、前端交互以及文件处理等多个方面。...
Hibernate是Java领域中广泛应用的对象关系映射(ORM)框架,它提供了一套强大的数据验证工具——Hibernate Validator,这正是"hibernate的校验框架validate"的核心内容。本文将详细介绍Hibernate Validator及其在...
在IT行业中,SpringMVC和Hibernate Validate是两个非常重要的组件,它们在开发企业级Web应用程序时发挥着关键作用。SpringMVC是Spring框架的一部分,它提供了模型-视图-控制器(MVC)架构,用于构建可维护、高性能的...
在Spring MVC框架中整合Hibernate的校验机制,可以极大地提高我们开发Web应用的效率和代码质量。这主要是通过使用Hibernate Validator来实现数据的验证,它是一个遵循JSR 303(Java Bean Validation)和JSR 349...
- `hibernate.c3p0.validate`: 是否在获取连接时验证其有效性,设置为`true`表示每次获取连接前都进行验证。 **3. 使用C3P0的优势** - **连接复用**:减少创建和销毁连接的开销,提高系统性能。 - **自动管理**:...
Hibernate是Java领域中一款广泛应用的关系对象映射框架,它极大地简化了数据库操作。"Hibernate四大属性"是指在配置Hibernate时,我们经常会遇到的四个关键属性,它们对于理解Hibernate的工作原理和优化数据库操作至...
综上所述,这个资源包提供了一个完整的Java Web开发示例,展示了如何将jQuery Validate与Spring、Struts和Hibernate进行集成,以构建一个具备用户认证功能的Web应用程序。对于初学者或者希望了解这些技术如何协同...
Hibernate是Java领域中一款广泛应用的关系对象映射框架,它允许开发者将数据库操作抽象化,以对象的方式进行处理,极大地简化了数据库编程。`hibernate.properties`是Hibernate的核心配置文件,用于设定与数据库连接...
理解并正确配置这些参数是使用Hibernate成功连接数据库、优化性能和确保应用程序正常运行的基础。而文件`0000.sql`可能是包含数据库脚本的文件,用于初始化数据库结构,与配置文件配合使用,确保数据库与实体类的...
《Hibernate Validator 深度解析与应用实践》 Hibernate Validator 是一个基于 Java Bean Validation 规范的开源验证框架,它是 Hibernate 项目的一部分,主要用于在 Java 应用程序中实现数据校验。本篇文章将深入...
在实际应用中,我们还可以使用`Validator`接口来执行验证,例如: ```java ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); Validator validator = factory.getValidator(); Set...
通过合理的配置,C3P0能够根据应用的实际需求动态调整连接池的大小,确保在不同负载情况下都能提供最佳的响应速度。 接下来,我们将详细介绍如何在Hibernate中配置C3P0连接池,包括配置文件的修改以及关键参数的...
本篇文章将详细阐述Hibernate中的主要参数设置,帮助开发者更好地理解和配置Hibernate应用。 1. **hibernate.dialect** 这个参数定义了数据库方言,决定了Hibernate如何生成SQL语句。例如,如果你使用的是MySQL,...
Hibernate Validator提供了丰富的内置验证注解,例如`@NotNull`、`@NotEmpty`、`@Size`、`@Min`、`@Max`等,这些注解可以直接应用到bean的字段上,简化了代码并提高了可读性。此外,它还支持自定义验证注解和消息,...
在实际应用中,我们可能还会看到异常处理机制,当验证失败时抛出异常并提供有意义的错误信息。 工具方面,开发人员可能使用自动化测试工具(如JUnit、TestNG)来验证程序的各个部分是否按预期工作。此外,静态代码...
在提供的压缩包`test_java_hibernate`中,可能包含了示例代码,如实体类、配置文件、测试类等,用于演示上述概念的实际应用。读者可以通过阅读和运行这些代码,更深入地理解Hibernate的注解方式自动建表功能。
validate-api工具类主要被用于Java应用中的数据校验,它基于JSR 303(Bean Validation)和JSR 349(Bean Validation 1.1)标准,提供了对对象属性的有效性验证功能。这个工具类的正常运行依赖于一系列的jar包,这些...
`SpringBoot validate`指的是Spring Boot集成Hibernate Validator进行参数验证的功能。Hibernate Validator是JSR-303/JSR-349标准的参考实现,提供了一种在Java应用中进行数据校验的优雅方式。 ** Hibernate ...
`supports`方法用于确定验证器是否能处理特定类型的对象,而`validate`方法则执行实际的验证逻辑。此外,也可以使用`@Valid`注解在服务层的方法参数上,来触发级联验证。 在`文档.doc`中,可能包含了关于如何配置和...