缺少jar包

SpringMVC可以使用Hibernate-validator作为效验的实现,需要的jar包:

hibernate-validator.jar

validation-api.jar

jboss-logging.jar这三个jar,但是我添加jar包之后项目启动之后报一个错误:

就是这个类找不到了,开始我还以为又是版本的问题,替换了几个不同的版本还是报这个错,最后我搜索得知这个TypeResolver类在classmate.jar 这个jar包,突然想起在做SSH整合的时候也有这个jar,只是Hibernate需要的jar,添加之后就可以了

效验信息乱码

我在springMVC.xml文件中配置了效验器:

<!--效验器-->
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<!--springMVC使用hibernate提供的效验器 -->
<property name="providerClass" value="org.hibernate.validator.HibernateValidator"/>
<!--指定效验错误使用的资源文件,在资源文件中定义校验规则,如不指定默认使用classpath下的ValidationMessage.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>
<property name="cacheSeconds" value="120"></property>
</bean>

指向一个我自己写的CustomValidationMessage.properties文件,我在这个属性文件中配置效验失败的信息

CustomValidationMessage.properties:

# 添加效验错误信息
items.name.length.error=请输入商品名称在1到30个字符之间
items.price.isNull=请输入商品价格

注意:properties文件一定要是utf-8编码的,这样我们就可以减少一个乱码的可能性,这个文件的编码可以在eclipse的设置中设置

我在商品模型Items 这个pojo类的属性上添加效验的注解:

最后在Controller中将错误信息传递到页面:

        //获取效验错误信息
if(bindingResult.hasErrors()){
//输出错误信息
List<ObjectError> allErrors = bindingResult.getAllErrors();
model.addAttribute("allErrors", allErrors);
//返回到页面如果不进行查询,图片无法进行数据回现
model.addAttribute("allErrors", allErrors);
return "items/editItems";

注意:使用效验器需要在Controller的方法形参上使用@Validated注解,并且在需要效验的pojo后面添加BindingResult,@Validated和BindingResult是成对出现的,顺序是固定的(一前一后)

页面使用JSTL:

<!-- 显示错误信息 -->
<c:if test="${allErrors!=null }">
<c:forEach items="${allErrors }" var="error">
${error.defaultMessage }<br/>
</c:forEach>
</c:if>

很不幸在页面上出现了乱码

我试了很多方法都没解决这个乱码问题,只有采用一个比较简单的方法:自己手动进行一次转码:

        //获取效验错误信息
if(bindingResult.hasErrors()){
//输出错误信息
List<ObjectError> allErrors = bindingResult.getAllErrors();
List<String> errorList=new ArrayList<String>();
for (ObjectError objectError : allErrors) {
errorList.add(new String(objectError.getDefaultMessage().getBytes("ISO-8859-1"),"utf-8"));
}
//将错误信息传递到页面
modelAndView.addObject("allErrors", errorList);
return "items/editItems";

自己创建一个list将错误信息从ISO-8859-1转成utf-8,再将这个list传递到页面,可以解决乱码

页面也需要修改:

<!-- 显示错误信息 -->
<c:if test="${allErrors!=null }">
<c:forEach items="${allErrors }" var="error">
${error }<br/>
</c:forEach>
</c:if>

页面使用${error },因为这是使用我们自己封装的list,它里面不是ObjectError对象,也就没有defaultMessage属性了

最后我发现即使在springMVC.xml文件中的validator属性中不配置messageSource(也就是不使用CustomValidationMessage.properties文件),直接在pojo类的属性上使用效验注解,在注解的message中使用类似硬编码的方式将错误信息写入:

即使不用手动转码,页面还是使用${error.defaultMessage }不用变,也不会乱码,还是使用注解的方式比较方便,但是硬编码有不利于维护。

更正

这一阵子我需要使用SpringMVC的验证器,所以想着也不能总是自己手动编码,需要验证的字段太多了,而且SpringMVC也比较成熟了,应该有对应的解决方法。通过查看源码发现:org.springframework.context.support.ReloadableResourceBundleMessageSource 类继承于AbstractResourceBasedMessageSource类,这个类中有一个defaultEncoding 属性,查看这个属性的set方法,发现其才是处理Properties文件编码的字段,而之前配的fileEncodings是一个Properties类型的属性,给它配“UTF-8”毫无意义.

而 AbstractResourceBasedMessageSource类 中的setDefaultEncoding(String)方法形参才是个String类型,这个方法的注释说的也很明白,就是在设置Properties文件字符编码的,默认使用ISO-8859-1,所以之前我们将ISO-8859-1转成UTF-8可以正确显示。

接下来将之前配的fileEncodings改为defaultEncoding即可:

<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basename" value="classpath:messages"/>
<property name="defaultEncoding" value="UTF-8"/>
<property name="cacheSeconds" value="120"/>
</bean>

也不需要我们自己去转码了,哎,以后遇到问题应该自己先去研究一下源码,说不定就可以很好的解决。

既然说的SpringMVC验证问题,我开始想使用JSR303的@NotNull注解来验证一个非空字段,页面什么都不填进行提交,这个非空验证却不起作用,DeBug发现其实springMVC将页面的空字段设置为“[ ]”,而并非null,所以这个注解就不起作用了,改为使用org.hibernate.validator.constraints.NotEmpty 这个注解即可。

 

SpringMVC使用Hibernate-validator验证出现的错误的更多相关文章

  1. springMvc 支持hibernate validator

    SpringMVC 支持Hibernate Validator 发表于9个月前(2014-08-04 11:34)   阅读(1780) | 评论(0) 11人收藏此文章, 我要收藏 赞0 5月23日 ...

  2. Hibernate Validator验证框架中@NotEmpty、@NotBlank、@NotNull 的区别

    Hibernate Validator验证框架中@NotEmpty.@NotBlank.@NotNull的主要使用情况 @NotEmpty  用在集合类上面 @NotBlank   用在String上 ...

  3. SpringMVC利用Hibernate validator做字段验证

    1.添加Hiberbate validator相关的jar包 2.字需要验证的formbean 上添加验证的注解,内置注解有: dBean Validation 中内置的 constraint @Nu ...

  4. Hibernate validator验证

    spring-mvc配置 <mvc:annotation-driven validator="validator" /> <bean id="valid ...

  5. Hibernate Validator验证标签说明

    Hibernate Validator是JSR-303的一个实现. 在FormBean里添加Hibernate Validator的注解,与定义一个校验类的做法相比.注解更加简洁.灵活. Bean V ...

  6. spring MVC 使用 hibernate validator验证框架,国际化配置

    spring mvc使用hibernate validator框架可以实现的功能: 1. 注解java bean声明校验规则. 2. 添加message错误信息源实现国际化配置. 3. 结合sprin ...

  7. spring 项目中使用 hibernate validator验证输入参数

    1 hibernate validator 官方文档:https://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_si ...

  8. spring boot 使用hibernate validator 验证service

    不在controller中验证,而是在service中验证. spring boot 默认使用的就是hibernate validator,存在于pom的spring-boot-starter-web ...

  9. hibernate validator 验证

    @AssertTrue 用于boolean字段,该字段只能为true   @AssertFalse 该字段的值只能为false @CreditCardNumber 对信用卡号进行一个大致的验证 @De ...

随机推荐

  1. 表单隐藏域与display:none

    有时候前端进行表单填写是分步骤的,每一步的时候其他步骤相关的表单视图不可见: 针对"不可见",以下有两种处理方式: ①display:none 这种方式呢,比较简单,就是将三个步骤 ...

  2. 基于tensorflow的增强学习

    可以通过下面的连接查看这个项目工程: https://github.com/reinforceio/tensorforce 通过这遍文章来了这个项目的使用: https://reinforce.io/ ...

  3. 浅谈深度学习中的激活函数 - The Activation Function in Deep Learning

    原文地址:http://www.cnblogs.com/rgvb178/p/6055213.html版权声明:本文为博主原创文章,未经博主允许不得转载. 激活函数的作用 首先,激活函数不是真的要去激活 ...

  4. GitHub https链接中输入账户和密码

    /********************************************************************** * GitHub https链接中输入账户和密码 * 说 ...

  5. CentOS下glibc更新

    使用java -agentpath=xxx时报该错,提示glibc版本过低:version `GLIBC_2.14' not found (required by /data/jjns/UEISecu ...

  6. Linux服务器运行环境搭建(二)——Redis数据库安装

    官网地址:http://redis.io/ 官网下载地址:http://redis.io/download 1. 下载Redis源码(tar.gz),并上传到Linux 2. 解压缩包:tar zxv ...

  7. Linux 用C语言实现简单的shell(2)

    不知不觉两周没有发文了,因为“一万美金的福特奖学金答辩”,ACM比赛,网络论文阅读和网络大作业一大堆事把时间冲散了,所以先写一篇博文补上之前一坑. 之前发了一篇关于linux 用C语言实现简单shel ...

  8. test20190320

    全连 \(n\leq 10^6\) ,保证答案在 \(long\ long​\) 范围内. 比较浅显的 \(dp\ ?\) 记 \(f[i]\) 表示考虑前 \(i\) 个音符,其中第 \(i\) 个 ...

  9. BZOJ1486 HNOI2009 最小圈 【01分数规划】

    BZOJ1486 HNOI2009 最小圈 Description 应该算是01分数规划的裸板题了吧..但是第一次写还是遇到了一些困难,vis数组不清零之类的 假设一个答案成立,那么一定可以找到一个环 ...

  10. 算法导论进度帖startedby20131029

    2013.10.29 今天开始啃难啃的算法导论,俗一点说,光阴似箭,剩下的时间已经不多了,所以开始好好奋进吧~ 第一章翻过去了,对附录中的数学基础再补看一遍,发现很多东西其实掌握的都很薄弱的,附录A的 ...