zoukankan      html  css  js  c++  java
  • @Valid springMVC bean校验不起作用

        @RequestMapping("/add2")
        public String addStudentValid(@Valid @ModelAttribute("s") Student s,BindingResult result){
            if(result.hasErrors()){
                List<FieldError> fieldErrors = result.getFieldErrors();
                
                for (FieldError fieldError : fieldErrors) {
                    log.info("errors --"+fieldError.getField()+fieldError.getDefaultMessage());
                }
            }
            log.info("s.name="+s.getName());
            log.info("s.age="+s.getAge());
            return "success";
        }
    import javax.validation.constraints.Min;
    import org.hibernate.validator.constraints.Length;
    import org.hibernate.validator.constraints.NotEmpty;
    
    public class Student {
    
        @NotEmpty
        @Length(min=4,message="{stu.name}")
        private String name;
        @Min(value=18,message="{stu.age}")
        private int age;
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
        
        @Override
        public String toString() {
            return "toString  -  name="+name+";age="+age;
        }
        
    }

    需要开启注解 <mvc:annotation-driven/>才能启用验证。否则@valid不管用。

    如果要使用错误提示的国际化消息,如stu.name为properties文件中的键值对
    @Length(min
    =4,message="{stu.name}")

    则需要在dispatcher-servlet.xml中配置

    <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">  
                <property name="basename" value="classpath:validmessages"/> 
                <property name="fileEncodings" value="utf-8"/>  
                <property name="cacheSeconds" value="120"/>  
    </bean>   
        
        <!-- 以下 validator  ConversionService 在使用 mvc:annotation-driven 会 自动注册-->  
        <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
            <property name="providerClass" value="org.hibernate.validator.HibernateValidator" />
            <!-- 如果不加默认到 使用classpath下的 ValidationMessages.properties -->
            <property name="validationMessageSource" ref="messageSource" />
        </bean> 
        
        <mvc:annotation-driven validator="validator"/>


    在src/main/resources下放入validmessages.properties即可。

    上面的配置设置了自定义validator,使用messageSource为错误消息提示资源文件。

    validmessages.properties内容为

    stu.name=u540Du79F0u7684u957Fu5EA6u4E0Du80FDu5C0Fu4E8E{min}u554A!
    stu.age=u5E74u9F84u5FC5u987Bu5927u4E8E{value}u5C81u554A!

    可以通过{value} {min} {max}等引用注解里的值。

    当名称长度小于4  age小于18 输出:

    名称的长度不能小于4啊!
    age年龄必须大于18岁啊!

    本次测试的dispatcher-servlet.xml为

    <?xml version="1.0" encoding="UTF-8"?>  
    <beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:p="http://www.springframework.org/schema/p" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:mvc="http://www.springframework.org/schema/mvc" 
     xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="  
        http://www.springframework.org/schema/beans   
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
        http://www.springframework.org/schema/context  
        http://www.springframework.org/schema/context/spring-context-3.0.xsd  
        http://www.springframework.org/schema/mvc  
        http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd  
         http://www.springframework.org/schema/tx
     http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
        ">  
       
       
       <context:component-scan base-package="com.upper"/>
       
        <!-- freemarker的配置 -->  
        <bean id="freemarkerConfigurer"  
            class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">  
            <property name="templateLoaderPath" value="/WEB-INF/views/" />  
            <property name="defaultEncoding" value="GBK" />  
            <property name="freemarkerSettings">  
                <props>  
                    <prop key="template_update_delay">0</prop>  
                    <prop key="locale">zh_CN</prop>  
                    <prop key="datetime_format">yyyy-MM-dd HH:mm:ss</prop>  
                    <prop key="date_format">yyyy-MM-dd</prop>  
                    <prop key="number_format">#.##</prop>  
                    <!--  <prop key="auto_import">c_index.tpl as p</prop> -->
                </props>  
            </property>  
        </bean>  
        <!-- FreeMarker视图解析 如返回userinfo。。在这里配置后缀名ftl和视图解析器。。 -->  
        <bean id="viewResolver"  
            class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">  
            <property name="viewClass"  
                value="org.springframework.web.servlet.view.freemarker.FreeMarkerView" />  
            <property name="suffix" value=".ftl" />  
            <property name="contentType" value="text/html;charset=GBK" />  
            <property name="exposeRequestAttributes" value="true" />  
            <property name="exposeSessionAttributes" value="true" />  
            <property name="exposeSpringMacroHelpers" value="true" />  
            <property name="requestContextAttribute" value="rc" />  
            <property name="allowSessionOverride" value="true"/>  
        </bean> 
        
        
        <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">  
                <property name="basename" value="classpath:validmessages"/>  
                <property name="fileEncodings" value="utf-8"/>  
                <property name="cacheSeconds" value="120"/>  
        </bean>   
        
        <!-- 以下 validator  ConversionService 在使用 mvc:annotation-driven 会 自动注册-->  
        <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
            <!-- 如果不加默认到 使用classpath下的 ValidationMessages.properties -->
            <property name="validationMessageSource" ref="messageSource" />
        </bean> 
        
        <mvc:annotation-driven validator="validator"/>
    </beans>
  • 相关阅读:
    pandas中expand的作用
    pandas中DataFrame的stack()、unstack()和pivot()方法的对比
    Django在windows下用Apache 部署
    pandas分组统计
    DataFrame中的空值处理
    Django signals 监控模型对象字段值的变化
    django+uwsgi+daphne+supervisor生产环境部署
    Django-Channels使用和部署
    Django使用Channels实现WebSocket的方法
    python 操作es
  • 原文地址:https://www.cnblogs.com/beenupper/p/3395872.html
Copyright © 2011-2022 走看看