Spring整合Hibernate Validator配置国际化时直接输出键值

在Spring中整合Hibernate-validator时,在自定义校验信息时无法输出键值对应的国际化信息直接原因输出使用注解配置的message,在其他网站上有过相同的问题提出,也是没有解决,在不适用自定义国际化信息时可以正常显示hibernate-validator中的默认国际化信息

Spring种的配置

<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> 
       <property name="useCodeAsDefaultMessage" value="false"/> 
       <property name="defaultEncoding" value="UTF-8"/> 
       <property name="fallbackToSystemLocale" value="true"/> 
       <property name="basenames"> 
           <list> 
               <value>classpath:bundle/messages</value>
               <value>classpath:org/hibernate/validator/ValidationMessages</value>     
           </list> 
       </property> 
   </bean>
   <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"> 
       <property name="providerClass" value="org.hibernate.validator.HibernateValidator"/> 
       <property name="validationMessageSource" ref="messageSource"/> 
   </bean>
    <mvc:annotation-driven validator="validator" />

java控制器中的代码

    @RequestMapping("valid-user")
    @ResponseBody
    public String validUserVo(@Valid @ModelAttribute UserVo user, BindingResult rs, ModelMap model) {
        logger.info("user:{}", user);
        logger.info("bind result:{}\nerror:{}", rs, rs.getFieldErrors());
        List<FieldError> errors = rs.getFieldErrors();
        for (FieldError error : errors) {
            String msg = error.getDefaultMessage();
            String code = error.getCode();
            logger.error("code:{},msg:{}",code, msg);
        }
        logger.info("model map:{}", model);
        if (rs.hasErrors()) {
            return rs.toString();
        }
        return "page";
    }

配置校验的模型类代码

    public class UserVo {
    @Size(min=2,max = 6,message="{size.u.name.len}")
    //@Size(min=2,max = 6)
    private String name;
    @Max(value=1,message="{max.sex}")
    //@Max(value=1)
    private int sex;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getSex() {
        return sex;
    }
    public void setSex(int sex) {
        this.sex = sex;
    }
    @Override
    public String toString(){
        return ToStringBuilder.reflectionToString(this);
    }
}

messages_zh_CN.properties配置

size.u.name.len=\u7528\u6237\u540D\u4E0D\u80FD\u4E3A\u7A7A\u957F\u5EA6\u5728{min}\u548C{max}\u4E4B\u95F4
max.sex=\u8D85\u8FC7\u6700\u5927\u503C{value}
    输出的在界面上的错误提示信息是:{size.u.name.len},不是语言文件配置的国际化信息
阅读 7.3k
4 个回答

这个配置出错了:

 <property name="basenames"> 
           <list> 
               <value>classpath:bundle/messages</value>
               <value>classpath:org/hibernate/validator/ValidationMessages</value>     
           </list> 
</property> 

正确的配置方式:

<property name="basenames"> 
           <list> 
               <value>bundle.messages</value>
               <value>org.hibernate.validator.ValidationMessages</value>     
           </list> 
</property>
新手上路,请多包涵

(1) put messages.properties to src/main/resources
(2) remove classpath:

新手上路,请多包涵

我是把注解搞错了,@Validated用成了@Valid

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题