spirng配置HibernateValidator的校验问题总结

1.建立一个maven项目
这里不在描述。网上搜一下
2.需要依赖的maven配置
 
 <dependency>
             <groupId>org.hibernate</groupId>
             <artifactId>hibernate-validator</artifactId>
             <version>5.2.2.Final</version>
         </dependency>
//spring我用的4.2.9.RELEASE。上了4.3.0就不会有对应的velocity的加载项了

3.配置对应的spring配置文件
//这里不写国际化消息拦截哪里配置了,应该不会有问题,网上复制一下就好了。
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
        <property name="providerClass"  value="org.hibernate.validator.HibernateValidator"/>
        <!--不设置则默认为classpath下的 ValidationMessages.properties -->
        <property name="validationMessageSource" ref="validationMessageSource"/>
    </bean>
    <!-- 默认的注解映射的支持 -->
    [color=red]<mvc:annotation-driven validator="validator"/>[/color]
    <bean id="validationMessageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <!-- 如果在国际化资源文件中找不到对应代码的信息,就用这个代码作为名称  -->
        <property name="useCodeAsDefaultMessage" value="false" />
        <property name="fileEncodings" value="utf-8"></property>
        <property name="basename">
            <value>[color=red]classpath:[/color]messages/messages</value>
        </property>
    </bean>

4.要验证的实体类
public class Spitter implements Serializable {

    @NotEmpty(message="不能为空额")
    @Pattern(regexp = "[a-zA-Z0-9_]{5,10}", message = "{username.illegal}")
    private String username;
    @Size(min = 5, max = 10, message = "{password.illegal}")
    private String password;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

对应的页面控制Controller
/**
     * 校验的控件
     * 标红的部分记住在@Valid所修饰的对象之后,也可以是Errors对象,是成对出现的
     * 相当于前面是给你一个标准,后边是对应哪个标准收集错误。
     * @param spitter
     * @param result
     * @return
     */
    @RequestMapping(value = "/valid", method = RequestMethod.GET)
    public String valid(@Valid Spitter spitter, [color=red]BindingResult result[/color], ModelMap modelMap) {
        if (result.hasErrors()) {
            modelMap.addAttribute("errors", result.getFieldError().getDefaultMessage());
            logger.error(result.toString());
        }
        return "insur_product";
    }

5.配置对应的/messages/messages_zh_CN.properties文件
username.illegal=请输入5-10位的字母数字下划线的用户名
#Size.spitter.password=密码[${validatedValue}]长度必须为{min}到{max}个字符
password.illegal=密码长度必须为{min}到{max}个字符。

6.出现校验问题解决
1.校验时候直接输出{password.illegal}
Field error in object 'spitter' on field 'password': rejected value [1]; codes [Size.spitter.password,Size.password,Size.java.lang.String,Size]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [spitter.password,password]; arguments []; default message [password],10,5]; default message [[color=red]{password.illegal}[/color]]

这个是你没有加载对properties文件。看看你的文件加载对不对。用tomcat+maven时候注意修改配置文件最好clean package一下
2.校验时候出现乱码问题如:
Field error in object 'spitter' on field 'password': rejected value [1]; codes [Size.spitter.password,Size.password,Size.java.lang.String,Size]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [spitter.password,password]; arguments []; default message [password],10,5]; default message [color=red][å¯†ç é•¿åº¦å¿…é¡»ä¸º5到10个字符][/color]

能到这里就是你已经正确配置了路径,但是你properties中中文不是unicode的编码,如果你不是idea你可以转成unicode编码放入properties文件,如果你是idea你只需要设置选中File | Settings | Editor | File Encodings
这样你就可以直接写中文了,不需要转化一次后复制进去,
3.不能解析出{}中的内容:同样是你的编码问题,你最好是将{}也使用unicode编码放入properties的文件,这样国际化配置消息就OK了。

猜你喜欢

转载自janle.iteye.com/blog/2360562