`
prodream
  • 浏览: 105602 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

spring验证器Validator接口

阅读更多

spring2.0

Validator接口

Method Summary
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 ========== --><!-- -->

Method Detail
<!-- -->

supports

boolean supports(Classclazz)
Can this 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.)

Parameters:
clazz - the Class that this Validator is being asked if it can validate
Returns:
true if this Validator can indeed validate instances of the supplied clazz

<!-- -->

validate

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.

The supplied errors instance can be used to report any resulting validation errors.

Parameters:
target - the object that is to be validated (can be null)
errors - contextual state about the validation process (never null)
See Also:
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 .

分享到:
评论

相关推荐

    Demo——使用Spring的Validator接口进行数据验证

    这个Demo示范了怎么通过Spring的Validator接口来进行数据验证,包括Validator的复用、jsp错误信息的展示等。可参考本人博客: http://blog.csdn.net/oLanMoMo/article/details/50530352

    spring_validator验证

    Validator接口是Spring提供的用于验证业务对象的工具,它定义了一组方法来执行验证操作并报告错误。 ### 二、注解驱动的验证 在Spring MVC 3.0及以上版本中,你可以使用JSR-303(Java Bean Validation)或其后续...

    struts验证器validator使用,以及自定义验证器

    自定义验证器需要实现`org.apache.struts2.validator.FieldValidator`接口,重写`validate()`方法。然后在`validation.xml`中指定自定义验证器类型。 例如,创建一个检查邮箱格式的自定义验证器: ```java public ...

    spring 学习 validator例子

    通过上述步骤,我们可以创建一个完整的Spring验证示例。在提供的压缩文件"validator"中,可能包含了实现这个过程的代码片段,包括验证器类、配置文件以及可能的测试用例。学习这个例子,可以帮助你更好地理解和应用...

    spring 验证总结

    本文将深入探讨Spring的两种主要验证机制:基于注解的验证和基于Validator接口的验证,并结合JSR303 Bean Validation规范来理解这些机制如何协同工作。 首先,我们来看Spring基于注解的验证。从Spring 3.0开始,...

    apach基于数据验证的工具包 commons-validator-1.3.1.jar

    5. **可扩展性(Extensibility)**:除了预定义的验证器外,用户可以通过实现Validator接口创建自己的验证逻辑。这样,你可以为任何复杂或特殊的数据类型创建专用的验证器。 6. **源码分析(Source Code)**:提供...

    Spring3.0 + springmodules 实现validator

    在这个场景中,我们可能会用到Springmodules的Validator接口和相应的实现类,通过它们我们可以创建自定义的验证规则。 使用基于注解的验证,首先我们需要在实体类的属性上定义验证规则,例如使用`@NotNull`、`@Size...

    Validator验证架框api

    在Spring MVC项目中,`Validator`可以与`@Validated`注解结合使用,实现在控制器方法中自动进行数据验证。此外,还可以通过实现`Validator`接口创建自定义的Spring Bean,以便在Spring上下文中使用。 五、总结 `...

    validator验证原代码

    - 在Spring MVC中,可以使用`@Validated`注解在控制器方法的参数上,使Spring自动进行数据验证。 - 验证失败时,Spring会自动将`ConstraintViolationException`转换为HTTP错误响应,例如400 Bad Request。 - 也...

    springmvc数据验证

    Spring MVC 提供了两种主要的数据验证方式:一种是基于JSR 303/349的Bean Validation,另一种是基于Validator接口的自定义验证。 1. **Bean Validation**:这是一个标准的Java Bean数据验证框架,它定义了一组注解...

    Struts1的validator验证框架

    除了内置的验证规则外,还可以通过实现`FieldValidator`接口来自定义验证逻辑。这允许开发者根据具体业务需求,编写更加复杂的验证代码。 #### 五、优化与调试 - **优化性能**:合理配置验证规则,避免不必要的...

    后台验证hibernate-validator必须的jar包

    `Hibernate Validator`是Java领域中最常用的验证框架之一,尤其在与Spring等框架结合使用时,能够方便地实现复杂的数据验证规则。本主题将详细讲解`Hibernate Validator`以及与之相关的`validation-api-2.0.1.Final....

    Validator

    `Validator`接口有两个主要的方法:`validate()`用于验证单个对象,`validateAllConstraints()`则验证对象的所有约束。 4. **验证上下文**:在验证过程中,`ValidationContext`提供了与验证相关的上下文信息,如...

    struts validator验证框架项目

    Struts Validator允许开发者创建自定义的验证器,以满足特定的业务需求。只需实现`Validator`接口并将其注册到配置文件中,即可扩展框架的功能。 6. **整合其他框架** 除了Struts,Struts Validator还可以与其他...

    22 Spring Core参数校验之validator慕课专栏(1)1

    本文主要探讨了Spring Core中的参数校验机制,特别是通过`Validator`接口进行的校验。在前后端分离的架构中,前端通常会进行初步的参数校验,但为了系统的健壮性,后端的校验同样重要,以防止恶意数据注入。 Spring...

    springMVC Validator表单验证

    在这个名为"springMVC_Validator"的项目中,我们关注的核心是SpringMVC中的表单验证功能,它通过集成Validator接口和使用自定义注解,提供了一种灵活且强大的验证机制。 表单验证在Web应用中扮演着至关重要的角色,...

    spirngmvc4适用的hibernate-validator后台验证的jar包,亲测可用

    4. 验证:在控制器中,使用`Validator`接口或`@Valid`注解对模型对象进行验证。当请求参数不符合验证规则时,Spring MVC会自动将错误信息绑定到模型中。 通过这样的配置,开发者可以轻松地在Spring MVC 4项目中实现...

    Spring中校验器(Validator)的深入讲解

    在Spring框架中,`Validator`接口提供了一种优雅的方式来实现数据的校验,尤其是在处理用户输入或业务逻辑之前确保数据的正确性。Spring的`Validator`组件遵循DRY(Don't Repeat Yourself)原则,帮助开发者避免重复...

    validator独立框架验证小例子

    除了使用内置的验证器,Apache Commons Validator还允许你创建自定义验证器。这可以通过实现`Validator`接口或使用注解`@Constraint`完成。例如,你可以创建一个检查邮箱是否有效的自定义验证器。 **四、小例子——...

    利用spring-modules验证框架进行表单验证

    总的来说,虽然Spring Modules验证框架已过时,但它代表了一种早期的验证实现方式,理解其工作原理有助于我们更好地理解和使用现代的Spring验证机制。在实际开发中,我们可以利用Spring Boot和Bean Validation,结合...

Global site tag (gtag.js) - Google Analytics