springmvc数据校验

今天被hiberna-validation校验整的有点晕,不过理清思路后,才发现真正导致这个错的原因还是自己太粗心了,记录下!首先是环境搭建,没错——加入jar包,使用maven的话就方便多了。
pom.xml中加入以下jar包依赖

 <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-validator</artifactId>
      <version>5.4.1.Final</version>
    </dependency>

其他依赖的jar包会自动加入
加好jar包后,就在springmvc的配置文件中进行配置。

<!-- 校验器 -->
    <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:CustomValidationMessages</value>
            </list>
        </property>
        <!-- 资源文件编码格式 -->
        <property name="fileEncodings" value="utf-8" />
        <!-- 对资源文件内容缓存时间,单位秒 -->
        <property name="cacheSeconds" value="120" />
    </bean>

messageSource的basenames属性,只取属性文件的名字即可,不用再加后缀。我把这个属性文件放在src下,所以路径如以上配置。
需要注意的是 资源文件名的配置,这里只需写上名字而不需要后缀,并且我是把这个属性文件放在src目录下,springmvc的配置文件也放在src目录下,本以为在同一个目录就不需要指定classpath下了,结果一直读不到属性文件,所以这里一定还是

classpath:CustomValidationMessages

指明classpath。配置完了校验器,怎么才能让校验器生效呢?校验可以使用页面js进行校验,但若想安全级别更高还是在服务器端的校验。校验有三个层次的校验:表现层(controller)的校验,业务层(Service)的校验(使用最多),持久层dao的校验(一般不在持久层进行校验)。
springmvc有前端控制器、处理器映射器、处理器适配器,视图解析器,处理器适配器是要执行handler(即controller)的,所以,无论是在controller校验,还是在Service校验都要将校验器配置在处理器适配器中,这里我使用了注解式的配置

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

注册完就可以使用这个校验器进行校验了
这里我做的小例子是校验dinnertable这个类里的tablename这个属性的长度在1到30个字符,orderdate这个属性不为空

 @Size(min = 1,max = 30,message = "{dinnertable.tablename.length}")
    public String getTablename() {
        return tablename;
    }
     @NotNull(message = "{dinnertable.orderdate}")
    public Date getOrderdate() {
        return orderdate;
    }

校验注解可以加在字段上、也可以加在属性上,但一定加在属性的getter方法上。message = “{dinnertable.orderdate}”注解的message属性定义了校验失败的错误信息,默认在hibernate-validator的jar包中org.hibernate.validator ResourceBundle下有校验失败的错误信息,

javax.validation.constraints.Null.message        = must be null
javax.validation.constraints.Past.message        = must be in the past
javax.validation.constraints.Pattern.message     = must match "{regexp}"
javax.validation.constraints.Size.message        = size must be between {min} and {max}

这里我取除了几个,可以重写其中的错误信息。其中的键呢,也都是javax.validation.constraints+注解名+message,那为了不影响其间冲突,我这里自定义了键值,看下属性文件

#添加校验的错误提示信息
dinnertable.tablename.length        =\u8bf7\u8f93\u5165 {min}\u5230{max}\u4e2a\u5b57\u7b26\u7684\u9910\u684c\u540d\u79f0
dinnertable.orderdate                    =\u8bf7\u8f93\u5165\u9910\u684c\u9884\u5b9a\u65f6\u95f4

其中还使用了{max},这里就是在注解中定义的max的值后面的ascii是我通过native2ascii.exe在cmd窗口生成的
界面的代码我简单写了个form这里就不贴了直接到controller

 @RequestMapping(value = "/testConverter",method=RequestMethod.POST)
    public String  testConverter(@Validated Dinnertable dinnertable, BindingResult bindingResult ){
        if(bindingResult.hasErrors()){
           List<ObjectError> errors=bindingResult.getAllErrors();
           for(ObjectError error:errors){
               System.out.println( error.getDefaultMessage());
           }
        }
        return "forward:../after/detail/boardList.jsp";
    }

@Validated 和BindingResult bindingResult必须在要校验的数据两边,一前一后,有几个要校验的数据就写几个,校验失败的错误信息就放到了bindingResult中,取出如图上,接下来,要将错误信息显示到哪里就看个人需求了
时间仓促,知识浅薄,若有遗漏或错误之处,多多指出

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值