如何使用springmvc进行数据校验

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用springmvc进行数据校验相关的知识,希望对你有一定的参考价值。

1. 环境准备
  springmvc中我们使用hibernate的校验框架validation(注:和hibernate没有任何关系),使用这个校验框架的话,需要导入jar包如下:
2. 配置校验器
  在springmvc.xml配置文件中配置一下校验器,如下:

<!-- 配置校验器 -->
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<!-- 校验器,使用hibernate校验器 -->
<property name="providerClass" value="org.hibernate.validator.HibernateValidator"/>
<!-- 指定校验使用的资源文件,在文件中配置校验错误信息,如果不指定则默认使用classpath下面的ValidationMessages.properties文件 -->
<property name="validationMessageSource" ref="messageSource"/>
</bean>
<!-- 校验错误信息配置文件 -->
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<!-- 资源文件名 -->
<property name="basenames">
<list>
<value>classpath:CustomValidationMessage</value>
</list>
</property>
<!-- 资源文件编码格式 -->
<property name="fileEncodings" value="utf-8"/>
<!-- 对资源文件内容缓存时间,单位秒 -->
<property name="cacheSeconds" value="120"/>
</bean>

配置规则就是bean和property属性,别把class和文件名写错了就行,这里有个配置是资源文件名,这个文件中我们将会配置一些错误信息。配置好了校验器后,需要将校验器注入到处理器适配器中,还是在springmvc.xml文件中,将我们配好的validator注入进去,如下:

  这样校验器就配置好了。
3. 在pojo中添加校验

注解
运行时检查

@AssertFalse 被注解的元素必须为false
@AssertTrue 被注解的元素必须为true
@DecimalMax(value) 被注解的元素必须为一个数字,其值必须小于等于指定的最小值
@DecimalMin(Value) 被注解的元素必须为一个数字,其值必须大于等于指定的最小值
@Digits(integer=, fraction=) 被注解的元素必须为一个数字,其值必须在可接受的范围内
@Future 被注解的元素必须是日期,检查给定的日期是否比现在晚
@Max(value) 被注解的元素必须为一个数字,其值必须小于等于指定的最大值(百度上好多传阅复制写错了 最小值)
@Min(value) 被注解的元素必须为一个数字,其值必须大于等于指定的最小值
@NotNull 被注解的元素必须不为null
@Null 被注解的元素必须为null
@Past(java.util.Date/Calendar) 被注解的元素必须过去的日期,检查标注对象中的值表示的日期比当前早
@Pattern(regex=, flag=) 被注解的元素必须符合正则表达式,检查该字符串是否能够在match指定的情况下被regex定义的正则表达式匹配
@Size(min=, max=) 被注解的元素必须在制定的范围(数据类型:String, Collection, Map and arrays)
@Valid 递归的对关联对象进行校验, 如果关联对象是个集合或者数组, 那么对其中的元素进行递归校验,如果是一个map,则对其中的值部分进行校验
@CreditCardNumber 对信用卡号进行一个大致的验证
@Email 被注释的元素必须是电子邮箱地址
@Length(min=, max=) 被注解的对象必须是字符串的大小必须在制定的范围内
@NotBlank 被注解的对象必须为字符串,不能为空,检查时会将空格忽略
@NotEmpty 被注释的对象必须为空(数据:String,Collection,Map,arrays)
@Range(min=, max=) 被注释的元素必须在合适的范围内 (数据:BigDecimal, BigInteger, String, byte, short, int, long and 原始类型的包装类 )
@URL(protocol=, host=, port=, regexp=, flags=) 被注解的对象必须是字符串,检查是否是一个有效的URL,如果提供了protocol,host等,则该URL还需满足提供的条件
  hibernate校验框架提供了很多注解校验,我先简单罗列一下:
上面我简单罗列了一些校验的注解,不同的注解的具体使用方法可以参考官方文档或者网上资料,这里我选择两个注解来说明如何使用这个hibernate验证框架。首先在自己的pojo中需要验证的属性上添加相应的验证注解:

  我们看到注解中可以指定message,那么这个message中的内容是错误消息配置文件中对应的key,取出来的就是对应的错误消息,所以针对这两个错误消息,我们写一下配置文件:

4. 捕获校验错误信息

  上面已经将校验相关的配置都配好了,接下来就需要在controller的方法中捕获校验结果中的错误信息,然后将这些错误信息传到前台去显示。那么controller的方法中该如何去捕获呢?如下:

  可以看出,在需要校验的pojo前边添加@Validated,在需要校验的pojo后边添加BindingResult bindingResult来接收校验出错信息。值得注意的是:@Validated和BindingResult bindingResult是配对出现,并且形参顺序是固定的(一前一后)。这样就可以顺利接收到错误信息了。关于前台的东西,我就不写了。

5. 分组校验

  上面已经能完成springmvc的校验功能了,但是有个问题:刚刚是在pojo中定义了校验规则,但是pojo是被多个controller使用的,现在假如两个不同的controller使用的校验规则是不一样的,简单来说,一个controller不需要去校验生产日期,只要校验一下商品名称即可,另一个controller两个都要校验,这样就没法做了,因为两个controller都使用同一个pojo。
  为了解决这个问题,我们可以定义多个校验分组(其实是一个Java接口),分组中定义有哪些规则,每个controller方法使用不同的校验分组即可。看一下下面的例子就明白了:
  首先定义一个校验分组:

public interface ValidGroup1

//接口中不需要定义任何方法,仅仅是对不同的校验规则进行分组
//此分组只校验商品名称的长度



然后我们在刚刚的pojo中,添加这个分组,如下:

  再看一下想要校验这个name字段的controller中是如何配置的:

  这样该controller就不会去校验生产日期的字段了,通过这种方式可以解决不同的controller校验不同字段的问题。
参考技术A

Spring数据校验 spring拥有自己独立的数据校验框架,同时支持JSR303标注校验。springDataBinder在进行数据绑定时,可同时调用校验框架完成数据校验工作。在spring mvc中则可直接通过注解驱动的方式进行数据校验 Validator校验接口

本回答被提问者采纳

SpringMVC中的 JSR 303 数据校验框架说明

JSR 303 是java为Bean数据合法性校验提供的标准框架,它已经包含在JavaEE 6.0中。
JSR 303 通过在Bean属性上标注类似于@NotNull、@Max等标准的注解指定校验规则,
并通过标准的验证接口对Bean进行验证:
---------------------------------------------------------------------------
注解                             说明
---------------------------------------------------------------------------
@Null                           被注释的元素必须为null
@NotNull                        被注释的元素不能为null
@AssertTrue                     被注释的元素必须为true
@AssertFalse                    被注释的元素必须为false
@Min(value)                     被注释的元素必须是一个数字,其值必须>=指定的最小值
@Max(value)                     被注释的元素必须是一个数字,其值必须<=指定的最大值
@DecimalMin(value)              被注释的元素必须是一个数字,其值必须>=指定的最小值
@DecimalMax(value)              被注释的元素必须是一个数字,其值必须<=指定的最大值
@Size(max, min)                 被注释的元素的大小必须在指定的范围内
@Digits(integer, fraction)      被注释的元素必须是一个数字,其值必须在可接受的范围内
@Past                           被注释的元素必须是一个过去的日期
@Future                         被注释的元素必须是一个将来的日期
@Pattern(value)                 被注释的元素必须符合指定的正则表达式

---------------------------------------------------------------------------
Hibernate Validation 是JSR 303 的一个参考实现,除支持所有的标准的校验注解之外,
它还支持以下的扩展注解:

注解                     说明
@Email                  被注释的元素必须是一个电子邮箱地址
@Length                 被注释的字符串的大小必须在指定的范围内
@NotEmpty               被注释的字符串必须非空
@Range                  被注释的元素必须在合适的范围内
---------------------------------------------------------------------------
Spring 4.0 拥有自己独立的数据校验框架,同时支持JSR 303 标准的校验框架。
Spring 在进行数据绑定时,可同时调用校验框架完成数据校验工作。
在SpringMVC中, 可直接通过注解驱动的方式进行数据校验。
Spring 的LocalValidatorFactoryBean 既实现了Spring的Validator接口,
也实现了 JSR 303 的Validator接口。只要在Spring容器中定义一个
LocalValidatorFactoryBean,即可将其注入到需要数据校验的Bean中。
Spring本身并没有提供 JSR303 的实现,所以必须将 JSR303 的实现者的jar包
放到类路径下。

通过在处理方法的入参上标注 @Valid注解 即可让SpringMVC 在完成数据绑定之后执行数据校验的工作。
在已经标注了 JSR303 注解的表单/命令对象前标注一个 @Valid, SpringMVC 框架在将请求参数绑定到
该入参对象后,就会调用校验框架根据注解生命的校验规则实施校验。

SpringMVC 是用过对处理方法签名的规约来保存校验结果的:
前一个表单/命令对象的校验结果保存到随后的入参中,这个保存的校验结果的入参必须是 BindingResult
或 Errors 类型,这两个类都位于 org.springframework.validation 包中。


但是需要注意的一点:
需要校验的bean对象和其绑定结果的BindingResult对象必须成对出现,而且它们两个必须紧挨着,之间不能有
其他的入参。

BindingResutl 其实是 Errors的子类, Errors 接口提供了获取错误信息的方法,如 getErrorCount()
或 getFieldErrors(String field)。
BindingResult 扩展了 Errors 接口。

 

以上是关于如何使用springmvc进行数据校验的主要内容,如果未能解决你的问题,请参考以下文章

SpringMVC学习06SpringMVC中的数据校验

SpringMVC 数据校验(JSR-303)

学习SpringMVC必知必会~springmvc的数据校验表单标签文件上传和下载

SpringMVC数据校验Bug-@Valid不起效BindingResult读取不到Error信息

SpringMVC中的 JSR 303 数据校验框架说明

springmvc--数据转换&数据格式化&数据校验