@Valid springMVC beanが機能しない

20518 ワード

    @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;

    }

    

}

検証を有効にするには、注記をオンにする必要があります.そうでなければ@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=\u540D\u79F0\u7684\u957F\u5EA6\u4E0D\u80FD\u5C0F\u4E8E{min}\u554A!stu.age=\u5E74\u9F84\u5FC5\u987B\u5927\u4E8E{value}\u5C81\u554A!
 
注記の値は{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>