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=)
这是标准的,可以写正则表达式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值