@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;
}
}
検証を有効にするには、注記
, 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>