缺少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. oracle和sql server 比较

    Oracle   SQLServer   比较 字符数据类型  CHAR  CHAR  都是固定长度字符资料但oracle里面最大度为2kb,SQLServer里面最大长度为8kb 变长字符数据类型  ...

  2. Mysql双机热备--预备知识

    1.双机热备 对于双机热备这一概念,我搜索了很多资料,最后,还是按照大多数资料所讲分成广义与狭义两种意义来说. 从广义上讲,就是对于重要的服务,使用两台服务器,互相备份,共同执行同一服务.当一台服务器 ...

  3. Linux:修改Shell命令提示符及颜色

    Linux修改Shell命令提示符及颜色   1. Linux登录过程中加载配置文件顺序: /etc/profile → /etc/profile.d/*.sh → ~/.bash_profile → ...

  4. c++下使用邮槽实现进程间通信

    Windows API提供了邮槽和命名管道两种机制来实现进程间通信,在这里使用C++实现邮槽. 邮槽是Windows提供的一种进程间单向通信的机制,进程中的一方只能读取(或写入)数据,而另一方只能写入 ...

  5. android 城市选择

    我们在开发过程中兰冕会有选着城市地点等东西,这些都是常用的东西,所以我也就将他封装起来了先来看看效果吧 1.首先看下项目的结构: 2.看下整体的项目效果 三:主ativity private Cont ...

  6. vim让一些不可见的字符显示出来吧

    http://www.cnblogs.com/chenwenbiao/archive/2011/10/26/2225467.html :set list

  7. ios一些噁心记录

    有时在tableview的头部会凭空多出一块空白区域,这是由于ios会"贴心"的多分配一些用于滑动的多余inset. 消除这一空白的方法是,在tableview所在的control ...

  8. LOJ2324. 「清华集训 2017」小 Y 和二叉树【贪心】【DP】【思维】【好】

    LINK 思路 首先贪新的思路是处理出以一个节点为根所有儿子的子树中中序遍历起始节点最小是多少 然后这个可以两次dfs来DP处理 然后就试图确定中序遍历的第一个节点 一定是siz<=2的编号最小 ...

  9. 再也不用克隆多个仓库啦!git worktree 一个 git 仓库可以连接多个工作目录

    我在 feature 分支开发得多些,但总时不时被高优先级的 BUG 打断需要临时去 develop 分一个分支出来解 BUG.git 2.6 以上开始提供了 worktree 功能,可以解决这样的问 ...

  10. 如何将常规的web 应用程序转化为云上多租户 SaaS 解决方案

    如何将web 应用程序转化为多租户 SaaS 解决方案 https://www.ibm.com/developerworks/cn/cloud/library/cl-multitenantsaas/i ...