SpringMVC实战(七)——数据校验

该文章基于《Spring+MyBatis企业应用实战》进行总结,旨在积累巩固
SpringMVC的校验有两种选择的方式,一种是利用Spring框架自带的Validation校验框架进行校验、另一种是利用Java验证规范中的JSR 303实现校验功能。

Validation校验框架

SpringMVC实战(二)——常见配置最后一部分我通过@InitBinder注册了Validatior,现在展示一种新的注册Validatior的方法

@Repository("XXXValidator")
public class XXXValidator implements Validator{
    @Override
    public boolean supports(Class<?> clazz){
        return XXX.class.isAssignableFrom(clazz);
    }
    @Override
    public void validate(Object targer,Errors errors){
        ValidationUtils.rejectIfEmpty(errors,"属性名称",null,"为空错误");
        if(校验条件){
            errros.rejectValue("属性名",null,"错误信息");
        }
    }
}

光有实现了Validator接口的类还不够,还需要将该实现类通过依赖注入注入进Controller中,这一点和使用@InitBinder不同,下面是注入的方式:

@Controller
public class XXXController{
    @Autowired
    @Qulifier("XXXValidator")
    private XXXValidator xxxvalidator;
}

Validator校验框架通过硬编码完成校验,会造成程序的耦合,因此更加推荐使用JSR303

JSR 303校验

JSR 303只是提出的一个标准,该标准建议使用Hibernate-Validator的实现,其中JSR 303标准提供了一下注解方法:

注解功能
@Null验证是否为null
@NotNull无法检查长度为0的字符串
@AssertTrue验证Boolean对象是否为true
@AssertFalse验证Boolean对象是否为false
@Max(value)验证是否小于等于指定值
@Min(value)验证是否大于等于指定值
@DecimalMax(value)效果同@Max,只是类型必须为BigDecimal类型
@DecimalMin(value)效果同@Min,只是类型必须为BigDecimal类型
@Digits(integer,fraction)验证字符串是否符合指定格式的数字,integer为整数精度,fraction为小数精度
@Size(min,max)验证长度是否在给定范围(针对Collection及String)
@Past验证Date是否在当前时间之前
@Future验证Date是否在当前事件之后
@Pattern(regexp)验证String对象是否符合正则表达式的规则

当然Hibernate-Validator实现也提供了额外的注释的扩展

注解功能
@NotBlank字符串是否为null,对于String会通过Trim并判断长度是否大于0
@URL验证是否为合法的URL
@Email验证是否为合法的邮件地址
@NotEmpty检查元素是否为null或者empty,用于Collection和String
@Range(min,max)验证属性值是否在合适的范围内,message用于存储错误信息

以上的所有注解都具有message属性用于保存错误信息
只在domain类的属性上进行注释是暂时不行的,还需要在Controller中通过在参数上同时使用@Valid、@ModelAttribute两个注解,才能完成JSR 303验证

@RequestMapping("/xxx")
public String test(@Valid @ModelAttribute Domain domain,Errors errors){
    if(errors.hasErrors()){
        ...
    }
}

JSR 303校验的国际化消息

当我们每次进行检验的时候,都会生成一个FieldError对象,它的类层次结构如下

可以看见他实现了MessageSourceResolvable接口,该接口用于对国际化资源进行解析。
当出现错误信息时,会产生下面的错误代码:
对应注释.对应domain.对应属性名,举个例子:URL.user1.blog。所以通过自定义的本地化文件就可以方便的输出国际化消息。关于SpringMVC的国际化,可以查看我之前的博客SpringMVC实战(四)——国际化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值