spring2.0
Validator接口
boolean |
supports(Classclazz) Can this Validator validate instances of the supplied clazz ? |
void |
validate(Objecttarget, Errorserrors) Validate the supplied target object, which must be of a Class for which the supports(Class) method typically has (or would) return true . |
<!-- ============ METHOD DETAIL ========== --><!-- -->
supports
boolean supports(Classclazz)
Validator
validate
instances of the supplied clazz
?
This method is typically implemented like so:
return Foo.class.isAssignableFrom(clazz);(Where
Foo
is the class (or superclass) of the actual object instance that is to be validated
.)
clazz
- the Class
that this Validator
is being asked if it can validate
true
if this Validator
can indeed validate
instances of the supplied clazz
<!-- -->
validate
void validate(Objecttarget, Errorserrors)
target
object, which must be of a Class
for which the supports(Class)
method typically has (or would) return true
.
The supplied errors
instance can be used to report any resulting validation errors.
target
- the object that is to be validated (can be null
)
errors
- contextual state about the validation process (never null
)
ValidationUtils
<!-- ========= END OF CLASS DATA ========= -->spring中文开发文档
1. 简介
对是否把校验当作业务逻辑这个问题,存在着正和反两种意见,而Spring提供的验证模式(和数据绑定)的设计对这两种意见都不排斥。特别是,校验应该不应该被强制绑定在Web层,而且应该很容易本地化并且可以方便地加入新的验证逻辑。基于上述的考虑,Spring提供了一个Validator接口。这是一个基础的接口并且适用于应用程序的任何一个层面。
数据绑定(Data binding)非常有用,它可以动态把用户输入与应用程序的域模型(或者你用于处理用户输入的对象)绑定起来。Spring针对此提供了所谓的DataBinder来完成这一功能。由Validator和DataBinder组成的validation验证包,主要被用于Spring的MVC框架。当然,他们同样可以被用于其他需要的地方。
BeanWrapper作为一个基础组件被用在了Spring框架中的很多地方。不过,你可能很少会需要直接使用BeanWrapper。由于这是一篇参考文档,因而我们觉得对此稍作解释还是有必要的。我们在这一章节里对BeanWrapper的说明,或许到了你日后试图进行类似对象与数据之间的绑定这种与BeanWrapper非常相关的操作时会有一些帮助。
Spring大量地使用了PropertyEditor(属性编辑器)。PropertyEditor的概念是JavaBean规范的一部分。正如上面提到的BeanWrapper一样,由于它与BeanWrapper以及DataBinder三者之间有着密切的联系,我们在这里同样对PropertyEditor作一番解释。
2. 使用Spring的Validator接口进行校验
你可以使用Spring提供的validator接口进行对象的校验。Validator接口与Errors协同工作,在Spring做校验的时候,它会将所有的校验错误汇总到Errors对象中去。
来看这个简单的数据对象:
public class Person {
private String name;
private int age;
// the usual getters and setters...
}实现org.springframework.validation.Validator接口中的两个方法,我们将为对Person类加上校验行为:
supports(Class):表示这个Validator是否支持该Class的实例?
validate(Object, org.springframework.validation.Errors):对提供的对象进行校验,并将校验的错误注册到传入的Errors 对象中。
实现一个Validator也比较简单,尤其是当你学会了Spring所提供的ValidationUtils以后。我们一起来看一下如何才能创建一个校验器。
public class PersonValidator implements Validator {
/**
* This Validator validates just Person instances
*/
public boolean supports(Class clazz) {
return Person.class.equals(clazz);
}
public void validate(Object obj, Errors e) {
ValidationUtils.rejectIfEmpty(e, "name", "name.empty");
Person p = (Person) obj;
if (p.getAge() < 0) {
e.rejectValue("age", "negativevalue");
} else if (p.getAge() > 110) {
e.rejectValue("age", "too.darn.old");
}
}
}
如你所见,我们使用了ValidationUtils中的一个静态方法rejectIfEmpty(..)来对name属性进行校验,假若'name'属性是 null 或者空字符串的话,就拒绝验证通过 。请参照ValidationUtils相关的JavaDoc,查看一下除了例子中介绍过的之外其他的一些功能。
对复杂对象来说,实现Validator类来验证其内置的属性类当然也是可行的,但是为每个内置类的示例实现Validator可能是个更好的主意。关于这样的一个'rich'这样的例子是Customer类,它包含两个String属性(first name 和second name),还有一个复杂的Address对象。Address对象可能独立于Customer对象,因此独立实现了一个AddressValidator。假若你希望你的CustomerValidator重用AddressValidator内部的逻辑,但是又不想通过拷贝粘贴来实现,你可以在你的CustomerValidator中依赖注入AddressValidator对象,或者创建一个。然后这样用:
public class CustomerValidator implements Validator {
private final Validator addressValidator;
public UserValidator(Validator addressValidator) {
if (addressValidator == null) {
throw new IllegalArgumentException("The supplied [Validator] is required and must not be null.");
}
if (!addressValidator.supports(Address.class)) {
throw new IllegalArgumentException(
"The supplied [Validator] must support the validation of [Address] instances.");
}
this.addressValidator = addressValidator;
}
/**
* This Validator validates Customer instances, and any subclasses of Customer too
*/
public boolean supports(Class clazz) {
return Customer.class.isAssignableFrom(clazz);
}
public void validate(Object target, Errors errors) {
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "firstName", "field.required");
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "surname", "field.required");
Customer customer = (Customer) target;
try {
errors.pushNestedPath("address");
ValidationUtils.invokeValidator(this.addressValidator, customer.getAddress(), errors);
} finally {
errors.popNestedPath();
}
}
}验证错误会被报告到传来的Errors对象中。在Spring Web MVC中,你可以使用<spring:bind/>标签来检查错误信息,当然你也可以自行处理错误。可以在它的Javadoc中找到它提供的方法的描述。
3. 从错误代码到错误信息
我们已经讨论了数据绑定和校验。最后我们来讨论一下与校验错误相对应的错误信息输出。在先前的示例中,我们对name和age字段进行了校验并发现了错误。如果我们想用MessageSource来输出错误信息,当某个字段校验出错时(在这个例子中是name和age)我们输出的是错误代码。无论你直接或者间接使用示例中的ValidationUtils 类来调用Errors接口中rejectValue方法或者任何一个其它的reject方法,底层的实现不仅为你注册了你传入的代码,还同时为你注册了许多额外的错误代码信息。而你使用的MessageCodesResolver将决定究竟注册什么样的错误代码。默认情况下,将会使用DefaultMessageCodesResolver。回到前面的例子,使用DefaultMessageCodesResolver,不仅会为你注册你提供的错误代码信息,同时还包含了你传入到reject方法中的字段信息。所以在这个例子中,你通过rejectValue("age", "too.darn.old")来注册一个字段校验错误。Spring不仅为你注册了too.darn.old这个代码,同时还为你注册了too.darn.old.age和too.darn.old.age.int来分别表示字段名称和字段的类型。这种是现实为了方面开发者来定位错误信息。
更多有关MessageCodesResolver的信息以及默认的策略可以在线访问相应的JavaDocs: MessageCodesResolver 和 DefaultMessageCodesResolver .
发表评论
-
spring-MessageSource
2010-05-05 15:41 1723将Spring自带的org.springframework.c ... -
spring的扩展点--PropertyPlaceholderConfigurer
2010-05-05 14:01 1074它的作用是一个资源属性的配置器,能够将BeanFactory的 ... -
ApplicationContextAware
2010-03-30 14:36 1155JDK-doc 2.5.6 Interface Applic ... -
org.springframework.beans.factory.BeanCreationException: Error creating bean wit
2010-01-24 18:45 3835org.springframework.beans.facto ... -
SPRING框架的7大模块
2008-08-23 16:48 987核心容器:核心容器 ... -
使用Spring编写第一个程序-spring初级体验
2008-08-23 16:52 789对最原始的HelloWorld.java ... -
Spring中BeanFactory配置文件的元素解析
2008-08-24 11:39 743<?xml version="1.0" ... -
使用Lookup方法注射方法
2008-08-24 17:46 699spring方法解决下面的问题:一个singleton bea ... -
替换任意的方法
2008-08-24 18:06 835在spring中不但提供了Lookup方法来注射方法,还提供了 ... -
一个普通表单控制器(SimpleFornController)处理视图流转的例子
2008-08-26 09:40 787Spring附有一些简单的窗体处理handler,这些hand ... -
SimpleFormController简单表单控制器的处理流程
2008-08-26 10:19 8751.当表单控制器接 ... -
SPRING分发器(DispatcherServlet)
2008-09-09 00:15 1366分发器(DispatcherServlet) Sprin ... -
Spring的View和ViewResolver的使用
2008-09-11 23:15 1533打开Spring的源代码,我们可以在org.springfra ... -
ModelAndView解析
2008-09-16 09:39 1268查看spring的帮助文档得到以下信息: org.sprin ... -
spring web mvc配置
2008-09-17 11:04 1131spring内建一个请求驱动 ... -
spring视图解析器
2008-09-17 15:21 1350spring最常用的JSP/JSTL视图解析器是: Int ... -
Spring dataSource配置
2010-01-23 13:40 1818不管通过何种持久化 ... -
AOP(Aspect Oriented Programming ) 面向切面编程
2010-01-23 13:38 835AOP是什么? AOP是OO ...
相关推荐
这个Demo示范了怎么通过Spring的Validator接口来进行数据验证,包括Validator的复用、jsp错误信息的展示等。可参考本人博客: http://blog.csdn.net/oLanMoMo/article/details/50530352
Validator接口是Spring提供的用于验证业务对象的工具,它定义了一组方法来执行验证操作并报告错误。 ### 二、注解驱动的验证 在Spring MVC 3.0及以上版本中,你可以使用JSR-303(Java Bean Validation)或其后续...
自定义验证器需要实现`org.apache.struts2.validator.FieldValidator`接口,重写`validate()`方法。然后在`validation.xml`中指定自定义验证器类型。 例如,创建一个检查邮箱格式的自定义验证器: ```java public ...
通过上述步骤,我们可以创建一个完整的Spring验证示例。在提供的压缩文件"validator"中,可能包含了实现这个过程的代码片段,包括验证器类、配置文件以及可能的测试用例。学习这个例子,可以帮助你更好地理解和应用...
本文将深入探讨Spring的两种主要验证机制:基于注解的验证和基于Validator接口的验证,并结合JSR303 Bean Validation规范来理解这些机制如何协同工作。 首先,我们来看Spring基于注解的验证。从Spring 3.0开始,...
5. **可扩展性(Extensibility)**:除了预定义的验证器外,用户可以通过实现Validator接口创建自己的验证逻辑。这样,你可以为任何复杂或特殊的数据类型创建专用的验证器。 6. **源码分析(Source Code)**:提供...
在这个场景中,我们可能会用到Springmodules的Validator接口和相应的实现类,通过它们我们可以创建自定义的验证规则。 使用基于注解的验证,首先我们需要在实体类的属性上定义验证规则,例如使用`@NotNull`、`@Size...
在Spring MVC项目中,`Validator`可以与`@Validated`注解结合使用,实现在控制器方法中自动进行数据验证。此外,还可以通过实现`Validator`接口创建自定义的Spring Bean,以便在Spring上下文中使用。 五、总结 `...
- 在Spring MVC中,可以使用`@Validated`注解在控制器方法的参数上,使Spring自动进行数据验证。 - 验证失败时,Spring会自动将`ConstraintViolationException`转换为HTTP错误响应,例如400 Bad Request。 - 也...
Spring MVC 提供了两种主要的数据验证方式:一种是基于JSR 303/349的Bean Validation,另一种是基于Validator接口的自定义验证。 1. **Bean Validation**:这是一个标准的Java Bean数据验证框架,它定义了一组注解...
除了内置的验证规则外,还可以通过实现`FieldValidator`接口来自定义验证逻辑。这允许开发者根据具体业务需求,编写更加复杂的验证代码。 #### 五、优化与调试 - **优化性能**:合理配置验证规则,避免不必要的...
`Hibernate Validator`是Java领域中最常用的验证框架之一,尤其在与Spring等框架结合使用时,能够方便地实现复杂的数据验证规则。本主题将详细讲解`Hibernate Validator`以及与之相关的`validation-api-2.0.1.Final....
`Validator`接口有两个主要的方法:`validate()`用于验证单个对象,`validateAllConstraints()`则验证对象的所有约束。 4. **验证上下文**:在验证过程中,`ValidationContext`提供了与验证相关的上下文信息,如...
Struts Validator允许开发者创建自定义的验证器,以满足特定的业务需求。只需实现`Validator`接口并将其注册到配置文件中,即可扩展框架的功能。 6. **整合其他框架** 除了Struts,Struts Validator还可以与其他...
本文主要探讨了Spring Core中的参数校验机制,特别是通过`Validator`接口进行的校验。在前后端分离的架构中,前端通常会进行初步的参数校验,但为了系统的健壮性,后端的校验同样重要,以防止恶意数据注入。 Spring...
在这个名为"springMVC_Validator"的项目中,我们关注的核心是SpringMVC中的表单验证功能,它通过集成Validator接口和使用自定义注解,提供了一种灵活且强大的验证机制。 表单验证在Web应用中扮演着至关重要的角色,...
4. 验证:在控制器中,使用`Validator`接口或`@Valid`注解对模型对象进行验证。当请求参数不符合验证规则时,Spring MVC会自动将错误信息绑定到模型中。 通过这样的配置,开发者可以轻松地在Spring MVC 4项目中实现...
在Spring框架中,`Validator`接口提供了一种优雅的方式来实现数据的校验,尤其是在处理用户输入或业务逻辑之前确保数据的正确性。Spring的`Validator`组件遵循DRY(Don't Repeat Yourself)原则,帮助开发者避免重复...
除了使用内置的验证器,Apache Commons Validator还允许你创建自定义验证器。这可以通过实现`Validator`接口或使用注解`@Constraint`完成。例如,你可以创建一个检查邮箱是否有效的自定义验证器。 **四、小例子——...
总的来说,虽然Spring Modules验证框架已过时,但它代表了一种早期的验证实现方式,理解其工作原理有助于我们更好地理解和使用现代的Spring验证机制。在实际开发中,我们可以利用Spring Boot和Bean Validation,结合...