SpringMVC进行请求数据校验

SpringMVC使用JSR-303校验规范,@Valid JSR-303是javaEE6的规范。

SpringMVC具体使用hibernate-validator校验框架(和hibernate的ORM没有关系),基于的bean的属性校验。*

1.引入依赖

项目引入jar包:

validation-api-1.0.0.GA.jar:JDK的接口;

hibernate-validator-4.2.0.Final.jar是对上述接口的实现;

log4j、slf4j、slf4j-log4j

或者maven方式加入jar依赖

<dependency>

<groupId>org.hibernate</groupId>

<artifactId>hibernate-validator</artifactId>

<version>5.2.4.Final</version>

</dependency>

<!-- http://mvnrepository.com/artifact/javax.validation/validation-api -->

<dependency>

<groupId>javax.validation</groupId>

<artifactId>validation-api</artifactId>

<version>1.1.0.Final</version>

</dependency>

 

2. 配置校验器

  在spring-mvc.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>

 

注意:在idea下开发有可能会报classpath:CustomValidationMessage不存在但是不影响开发

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

<mvc:annotation-driven conversion-service="conversion-service" validator="validator"/>

这样校验器就配置好了。

1.1注解用法:

1) 可用的 JSR303注解hibernate校验框架提供了很多注解校验,我先简单罗列一下:

注解运行时检查
@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验证框架。首先在自己的pojo中需要验证的属性上添加相应的验证注解:(可以添加多个注解验证)

@NotNull(message = "{common.orderNo.not.empty}")
@Length(min = 0, max = 21, message = "{common.orderNo.length.error}")
private String orderNo;//商户订单号
@NotNull(message="名字不能为空")
private String userName;
@Max(value=120,message="年龄最大不能查过120") 
privateint age; @Email(message="邮箱格式错误") 
private String email;

 

 

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

##CustomValidationMessage.properties

common.reqMsgId.not.empty=参数reqMsgId不能为空!

common.oriReqMsgId.not.empty=参数oriReqMsgId不能为空!

4. 捕获校验错误信息

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

@RequestMapping("/login")
    public String testValid(@Valid User user, BindingResult result){
        if (result.hasErrors()){
            List<ObjectError> errorList = result.getAllErrors();
                  StringBuffer errorMessage = new StringBuffer();
            for(ObjectError error : errorList){
                String strError = new String(error.getDefaultMessage().getBytes("UTF-8"), "UTF-8");//把返回错误的提示再次编码
                errorMessage.append(strError);
                errorMessage.append(";");
                System.out.println(errorMessage.toString());
            }
        }
        return "test";
    }

 

  在需要校验的pojo前边添加@Validated或者@Valid,在需要校验的pojo后边添加BindingResult bindingResult来接收校验出错信息。值得注意的是:@Validated和BindingResult bindingResult是配对出现,并且形参顺序是固定的(一前一后)。这样就可以顺利接收到错误信息了,否则spring会在校验不通过时直接抛出异常。

转载于:https://my.oschina.net/zhaky/blog/852462

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值