今天复习hibernateValidator框架,突然这里直接显示错误码,而不是对应properties文件配置的中文。
明明我的配置文件是有配置的。
CustomValidationMessages.properties
items.pic.NotEmpty = 图片不能为空
items.name.length.error = 商品名称长度在5~20个字符之间
items.price.range.error = 商品价格不能为负数
items.detail.NotNull.error= 商品描述不能为空
items.createtime.NotNull.error = 生产日期不能为空
items.price.NotNull.error = 价格不能为空
items.detail.length.error = 商品描述最少4个字符
items.detail.NotEmpty.error = 商品名称不能为空
一开始我还以为是EL表达式不解析的原因,后来加上<%@ page isELIgnored=“false” %>
,还是不行。
接着检查POJO类的注解是否写正确了:
POJO类代码:
@Length(min = 5,max = 20,message = "{items.name.length.error}")
@NotEmpty(message = "{items.detail.NotEmpty.error}")
private String name;
@NotNull(message = "{items.price.NotNull.error}")
@Range(min = 0,message = "{items.price.range.error}")
private Float price;
@NotEmpty(message = "{items.pic.NotEmpty}")
private String pic;
@NotNull(message = "{items.createtime.NotNull.error}")
private Date createtime;
@NotEmpty(message = "{items.detail.NotNull.error}")
@Length(min = 5,message="{items.detail.length.error}")
发现也没毛病,接着我检查jsp代码:
jsp:
<c:if test="${allErrors!=null}">
<c:forEach items="${allErrors}" var="err">
<ul>
<li>
<span style="color: blueviolet;font-size: 15px;" >${err.defaultMessage}</span>
</li>
</ul>
</c:forEach>
</c:if>
JSP也没错误,后来我干脆直接在controller上面输出错误信息提示:看看在controller是否获取到了自己配置的错误信息。
输出的错误信息:发现确实没有获取到自己的配置。
为了验证,我将CustomValidationMessages.properties文件删除掉,依然是这样的输出,原来程序根本就没有读取到配置文件。后来经过代码对比,发现了问题所在:
原来我的springmvc.xml的代码漏了,没把校验器注入到处理器适配器,程序就直接读取注解上面的错误码。
<!-- 之前是这样写的:
<mvc:annotation-driven conversion-service="conversionService"/>
-->
<mvc:annotation-driven conversion-service="conversionService" validator="validator"/>
<!--配置校验器-->
<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="fileEncodings" value="utf-8" />
<property name="defaultEncoding" value="utf-8"/>
<!--资源文件名-->
<property name="basenames">
<list>
<value>classpath:CustomValidationMessages</value>
</list>
</property>
<!--对资源文件内容缓冲时间,单位秒-->
<property name="cacheSeconds" value="120"/>
</bean>
在<mvc:annotation-driven>
标签中加上 validator=“validator” ,之后就成功了。
在解决这个问题的过程中也出现了一些其它问题:
比如说CustomValidationMessages.properties文件只能放在resource跟目录下,不能放在其它地方,不然还是找不到这个文件,暂时没有解决办法,我发现会出现这种情况的文件还有log4j.properties,这个可以在web.xml中进行配置就可以放置在其它目录下了。
至于页面出现校验提示乱码,我另外一篇文章有提到解决办法。