spring 3.0中的校验

在weapon项目中,表单在客户端实现了校验,简单而有效。但是还要提防可能出现的客户端校验失效问题,在这种情况下也要做到服务器端不会录入问题数据。这就需要服务器端校验。

spring 3.0引入了jsr 303的java校验工具框架。

需要导入的类库:

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>4.0.0.GA</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.5.6</version>
</dependency>

 

spring的配置:

<bean
    class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="webBindingInitializer">
        <bean
            class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
            <property name="validator" ref="validator" />
        </bean>
    </property>
</bean>

<bean id="validator"
    class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" />

 

然后写点儿代码即可。首先是domain对象,就是javabean,要校验的名词对象,需要这样写:

@NotNull
@NotEmpty
private String name;

 

表示不能为空,也不能为空字串。这里NotEmpty不是jsr303标准的注解,是hibernate扩展的。

使用校验:

@RequestMapping(value = "/save.json", method = RequestMethod.POST)
public String save(@Valid Weapon weapon, BindingResult results) {
    if (results.hasErrors()) {
        throw new RuntimeException(results.getAllErrors().toString());
    }

    if (weapon.getId() == null || weapon.getId().isEmpty()) {
        create(weapon);
    } else {
        update(weapon);
    }

    return "saved";
}

在这里通过Valid注解,标注需要校验的变量。后面的BindingResult,是存储错误信息的对象。这里做的很简单,如果校验有错误,将直接抛出runtime异常。因为正常情况下都应该通过客户端的校验机制处理了。

这里将客户端校验代码屏蔽,测试到的结果是返回了异常:

java.lang.RuntimeException: [Field error in object 'weapon' on field 'name': rejected value []; codes [NotEmpty.weapon.name,NotEmpty.name,NotEmpty.java.lang.String,NotEmpty]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [weapon.name,name]; arguments []; default message [name],{org.hibernate.validator.constraints.NotEmpty.message},[Ljava.lang.Class;@1d6ced0,[Ljava.lang.Class;@1a3ece5]; default message [may not be empty]]
    at com.easymorse.weapons.server.WeaponService.save(WeaponService.java:74)

另外,还可以在注解中使用提示信息,比如:

@NotEmpty(message=”请输入名称”)

还有,校验注释有:

@Pattern(regex=, flag=)

这是标准的,可以写正则表达式。

源代码:

http://easymorse.googlecode.com/svn/tags/Weapons-0.5.5

相关日志

1 评论 to “spring 3.0中的校验”

  1. By 无名, 2010年04月19日 @ 09:45

    正在找spring 3.0的校验 非常感谢

这篇文章上的评论 RSS feed TrackBack URI

留下评论