`
jinnianshilongnian
  • 浏览: 21431897 次
  • 性别: Icon_minigender_1
博客专栏
5c8dac6a-21dc-3466-8abb-057664ab39c7
跟我学spring3
浏览量:2404600
D659df3e-4ad7-3b12-8b9a-1e94abd75ac3
Spring杂谈
浏览量:2997292
43989fe4-8b6b-3109-aaec-379d27dd4090
跟开涛学SpringMVC...
浏览量:5631162
1df97887-a9e1-3328-b6da-091f51f886a1
Servlet3.1规范翻...
浏览量:257464
4f347843-a078-36c1-977f-797c7fc123fc
springmvc杂谈
浏览量:1593032
22722232-95c1-34f2-b8e1-d059493d3d98
hibernate杂谈
浏览量:248918
45b32b6f-7468-3077-be40-00a5853c9a48
跟我学Shiro
浏览量:5847128
Group-logo
跟我学Nginx+Lua开...
浏览量:697981
5041f67a-12b2-30ba-814d-b55f466529d5
亿级流量网站架构核心技术
浏览量:780313
社区版块
存档分类
最新评论

SpringMVC数据验证——第七章 注解式控制器的数据验证、类型转换及格式化——跟着开涛学SpringMVC

 
阅读更多

7.4、数据验证

7.4.1、编程式数据验证

Spring 2.x提供了编程式验证支持,详见【4.16.2 数据验证】章节,在此我们重写【4.16.2.4.1、编程式验证器】一节示例。

 

(1、验证器实现

复制cn.javass.chapter4.web.controller.support.validator.UserModelValidator

cn.javass.chapter7.web.controller.support.validator.UserModelValidator

(2、控制器实现

@Controller
public class RegisterSimpleFormController {
	private UserModelValidator validator = new UserModelValidator();

	@ModelAttribute("user")        //① 暴露表单引用对象为模型数据
	public UserModel getUser() {
		return new UserModel();
	}
	@RequestMapping(value = "/validator", method = RequestMethod.GET)
	public String showRegisterForm() {   //② 表单展示
		return "validate/registerAndValidator";
	}
	@RequestMapping(value = "/validator", method = RequestMethod.POST)
	public String submitForm(
			@ModelAttribute("user") UserModel user,
			Errors errors) {           //③ 表单提交
		validator.validate(user, errors);  //1 调用UserModelValidator的validate方法进行验证
		if(errors.hasErrors()) { //2如果有错误再回到表单展示页面
			return showRegisterForm();
		}
		return "redirect:/success";
	}
} 

在submitForm方法中,我们首先调用之前写的UserModelValidator的validate方法进行验证,当然此处可以直接验证并通过Errors接口来保留错误;此处还通过 Errors接口的hasErrors方法来决定当验证失败时显示的错误页面。

 

3、spring配置文件chapter7-servlet.xml

<bean class="cn.javass.chapter7.web.controller.RegisterSimpleFormController"/> 

4、错误码配置(messages.properties),需要执行NativeToAscii

直接将【springmvc-chapter4】项目中src下的messages.properties复制到src目录下。

 

spring配置文件chapter7-servlet.xml中添加messageSource

<bean id="messageSource" 
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <property name="basename" value="classpath:messages"/>
        <property name="fileEncodings" value="utf-8"/>
        <property name="cacheSeconds" value="120"/>
</bean> 

 

5、视图页面(/WEB-INF/jsp/registerAndValidator.jsp)

直接将【springmvc-chapter4】项目中的/WEB-INF/jsp/registerAndValidator.jsp复制到当前项目下的/WEB-INF/jsp/validate/registerAndValidator.jsp。

 

6、启动服务器测试:

在浏览器地址栏输入http://localhost:9080/springmvc-chapter7/validator进行测试,测试步骤和【4.16.2.4.1、编程式验证器】一样。

 

其他编程式验证的使用,请参考【4.16.2 数据验证】章节。

 

7.4.2、声明式数据验证

Spring3开始支持JSR-303验证框架,JSR-303支持XML风格的和注解风格的验证,接下来我们首先看一下如何和Spring集成。

7.4.2.1、集成

1、添加jar包:

此处使用Hibernate-validator实现(版本:hibernate-validator-4.3.0.Final-dist.zip),将如下jar包添加到classpath(WEB-INF/lib下即可):

 写道
dist/lib/required/validation-api-1.0.0.GA.jar JSR-303规范API包
dist/hibernate-validator-4.3.0.Final.jar Hibernate 参考实现

2、在Spring配置总添加对JSR-303验证框架的支持   

 

<!-- 以下 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> 

此处使用Hibernate validator实现:

validationMessageSource属性:指定国际化错误消息从哪里取,此处使用之前定义的messageSource来获取国际化消息;如果此处不指定该属性,则默认到classpath下的ValidationMessages.properties取国际化错误消息。

 

通过ConfigurableWebBindingInitializer注册validator:

<bean id="webBindingInitializer" 
class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
	    <property name="conversionService" ref="conversionService"/>
	    <property name="validator" ref="validator"/>
</bean> 

其他配置和之前学习7.2.2.4一节一样。

 

如上集成过程看起来比较麻烦,后边我们会介绍<mvc:annotation-driven>和@EnableWebMvc,ConversionService会自动注册,后续章节再详细介绍。

 

3、使用JSR-303验证框架注解为模型对象指定验证信息

package cn.javass.chapter7.model;
import javax.validation.constraints.NotNull;
public class UserModel {
	@NotNull(message="{username.not.empty}")
	private String username;
} 

通过@NotNull指定此username字段不允许为空,当验证失败时将从之前指定的messageSource中获取“username.not.empty”对于的错误信息,此处只有通过“{错误消息键值}”格式指定的才能从messageSource获取。

 

4、控制器

package cn.javass.chapter7.web.controller.validate;
//省略import
@Controller
public class HelloWorldController {
	@RequestMapping("/validate/hello")
	public String validate(@Valid @ModelAttribute("user") UserModel user, Errors errors) {
		
		if(errors.hasErrors()) {
			return "validate/error";
		}
		return "redirect:/success";
	}
} 

通过在命令对象上注解@Valid来告诉Spring MVC此命令对象在绑定完毕后需要进行JSR-303验证,如果验证失败会将错误信息添加到errors错误对象中。

 

5、验证失败后需要展示的页面(/WEB-INF/jsp/validate/error.jsp)

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

<form:form commandName="user">
	<form:errors path="*" cssStyle="color:red"></form:errors><br/>
</form:form> 

6、测试

在浏览器地址栏中输入http://localhost:9080/springmvc-chapter7/validate/hello,即没有username数据,请求后将直接到验证失败界面并显示错误消息“用户名不能为空”,如果请求时带上“?username=zhang”将重定向到成功页面。

 

到此集成就完成,接下来我们详细学习下有哪些验证约束注解吧。

7.4.2.2、内置的验证约束注解

内置的验证约束注解如下表所示(摘自hibernate validator reference):

验证注解

验证的数据类型

说明

@AssertFalse

Boolean,boolean

验证注解的元素值是false

@AssertTrue

Boolean,boolean

验证注解的元素值是true

@NotNull

任意类型

验证注解的元素值不是null

@Null

任意类型

验证注解的元素值是null

@Min(value=值)

BigDecimal,BigInteger, byte,

short, int, long,等任何Number或CharSequence(存储的是数字)子类型

验证注解的元素值大于等于@Min指定的value值

@Max(value=值)

@Min要求一样

验证注解的元素值小于等于@Max指定的value值

@DecimalMin(value=值)

@Min要求一样

验证注解的元素值大于等于@ DecimalMin指定的value值

@DecimalMax(value=值)

@Min要求一样

验证注解的元素值小于等于@ DecimalMax指定的value值

@Digits(integer=整数位数, fraction=小数位数)

@Min要求一样

验证注解的元素值的整数位数和小数位数上限

@Size(min=下限, max=上限)

字符串、Collection、Map、数组等

验证注解的元素值的在min和max(包含)指定区间之内,如字符长度、集合大小

@Past

java.util.Date,

java.util.Calendar;

Joda Time类库的日期类型

验证注解的元素值(日期类型)比当前时间早

@Future

@Past要求一样

验证注解的元素值(日期类型)比当前时间晚

@NotBlank

CharSequence子类型

验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的首位空格

@Length(min=下限, max=上限)

CharSequence子类型

验证注解的元素值长度在min和max区间内

@NotEmpty

CharSequence子类型、Collection、Map、数组

验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0)

@Range(min=最小值, max=最大值)

BigDecimal,BigInteger,CharSequence, byte, short, int, long等原子类型和包装类型

验证注解的元素值在最小值和最大值之间

@Email(regexp=正则表达式,

flag=标志的模式)

CharSequence子类型(如String)

验证注解的元素值是Email,也可以通过regexp和flag指定自定义的email格式

@Pattern(regexp=正则表达式,

flag=标志的模式)

String,任何CharSequence的子类型

验证注解的元素值与指定的正则表达式匹配

@Valid

任何非原子类型

指定递归验证关联的对象;

如用户对象中有个地址对象属性,如果想在验证用户对象时一起验证地址对象的话,在地址对象上加@Valid注解即可级联验证

 

此处只列出Hibernate Validator提供的大部分验证约束注解,请参考hibernate validator官方文档了解其他验证约束注解和进行自定义的验证约束注解定义。

 

具体演示实例请参考cn.javass.chapter7.web.controller.validate.ValidatorAnnotationTestController。

7.4.2.3、错误消息

当验证出错时,我们需要给用户展示错误消息告诉用户出错的原因,因此我们要为验证约束注解指定错误消息。错误消息是通过在验证约束注解的message属性指定。验证约束注解指定错误消息有如下两种方式:

1、硬编码错误消息;

2、从资源消息文件中根据消息键读取错误消息。

 

一、硬编码错误消息

直接在验证约束注解上指定错误消息,如下所示:

@NotNull(message = "用户名不能为空")
@Length(min=5, max=20, message="用户名长度必须在5-20之间")
@Pattern(regexp = "^[a-zA-Z_]\\w{4,19}$", message = "用户名必须以字母下划线开头,可由字母数字下划线组成")
private String username; 

如上所示,错误消息使用硬编码指定,这种方式是不推荐使用的,因为在如下场景是不适用的:

1、在国际化场景下,需要对不同的国家显示不同的错误消息;

2、需要更换错误消息时是比较麻烦的,需要找到相应的类进行更换,并重新编译发布。

 

二、从资源消息文件中根据消息键读取错误消息

 

2.1、默认的错误消息文件及默认错误消息键值

默认的错误消息文件是/org/hibernate/validator/ValidationMessages.properties,如下图所示:



 默认的错误消息键值如下图所示:



 消息键默认为:验证约束注解的全限定类名.message

 

在我们之前的测试文件中,错误消息键值是使用默认的,如何自定义错误消息文件和错误消息键值呢?

 

2.2、自定义的错误消息文件和错误消息键值

自定义的错误消息文件里的错误消息键值将覆盖默认的错误消息文件中的错误消息键值。我们自定义的错误消息文件是具有国际化功能的。

 

1、定义错误消息文件

在类装载路径的根下创建ValidationMessages.properties文件,如在src目录下创建会自动复制到类装载路径的根下,并添加如下消息键值(需要native2ascii,可以在eclipse里装Properties Editor,自动保存为ASCII码):

 

javax.validation.constraints.Pattern.message=用户名必须以字母或下划线开头,后边可以跟字母数字下划线,长度在5-20之间

需要在你的spring配置文件WEB-INF/chapter7-servlet.xml修改之前的validator Bean:

 

<bean id="validator" 
class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
        <property name="providerClass" 
value="org.hibernate.validator.HibernateValidator"/>
</bean> 

此时错误消息键值的查找会先到classpath下ValidationMessages.properties中找,找不到再到默认的错误消息文件中找。

 

输入测试地址:http://localhost:9080/springmvc-chapter7/validate/pattern?value=zhan,将看到我们自定义的错误消息显示出来了。

 

2、使用Spring的MessageSource Bean进行消息键值的查找

如果我们的环境是与spring集成,还是应该使用Spring提供的消息支持,具体配置如下:

 

spring配置文件WEB-INF/chapter7-servlet.xml定义MessageSource Bean:

<bean id="messageSource" 
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <property name="basename" value="classpath:messages"/>
        <property name="fileEncodings" value="utf-8"/>
        <property name="cacheSeconds" value="120"/>
</bean> 

之前我们已经配置过了,在此就不详述了。

 

spring配置文件WEB-INF/chapter7-servlet.xml定义的validator Bean,添加如下属性:

<property name="validationMessageSource" ref="messageSource"/>

 验证失败的错误消息键值的查找将使用messageSource Bean进行。

 

在消息文件src/messages.properties中添加如下错误消息:

javax.validation.constraints.Pattern.message=用户名必须以字母或下划线开头,后边可以跟字母数字下划线,长度在5-20之间

输入测试地址:http://localhost:9080/springmvc-chapter7/validate/pattern?value=zhan,将看到我们自定义的错误消息显示出来了。

 

当我们配置了messageSource Bean时,默认将为验证的对象自动生成如下错误消息键:

验证错误注解简单类名.验证对象名.字段名

验证错误注解简单类名.字段名

验证错误注解简单类名.字段类型全限定类名

验证错误注解简单类名

 

使用的优先级是:从高到低,即最前边的具有最高的优先级,而且以上所有默认的错误消息键优先级高于自定义的错误消息键。

 

如测试用例cn.javass.chapter7.web.controller.validate.ValidatorAnnotationTestController中的public String pattern(@Valid @ModelAttribute("model") PatternModel model, Errors errors)将自动产生如下错误消息键:

Pattern.model.value=验证错误注解简单类名.验证对象名.字段名

Pattern.value=验证错误注解简单类名.字段名

Pattern.java.lang.String=验证错误注解简单类名.字段类型全限定类名

Pattern=验证错误注解简单类名

 

3、自定义错误消息键值

之前我们已经学习了硬编码错误消息,及默认的错误消息,在大部分场景下,以上两种方式无法满足我们的需求,因此我们需要自定义错误消息键值。

 

在验证约束注解上指定错误消息键:

package cn.javass.chapter7.web.controller.validate.model;
public class PatternModel {	
	@Pattern(regexp = "^[a-zA-Z_][\\w]{4,19}$", message="{user.name.error}")
	private String value;
} 

我们可以通过验证约束注解的message属性指定错误消息键,格式如“{消息键}”。

 

在消息文件src/messages.properties中添加如下错误消息:

user.name.error=用户名格式不合法

输入测试地址:http://localhost:9080/springmvc-chapter7/validate/pattern?value=zhan,将看到我们自定义的错误消息显示出来了。

 

接下来我们看下如下场景

@Length(min=5, max=20, message="{user.name.length.error}")
user.name.error=用户名长度必须在5-20之间

错误消息中的5-20应该是从@Length验证约束注解中获取的,而不是在错误消息中硬编码,因此我们需要占位符的支持:

●如@Length(min=5, max=20, message="{user.name.length.error}"),错误消息可以这样写:用户名长度必须在{min}-{max}之间

 

错误消息占位符规则:

{验证注解属性名},如@Length有min和max属性,则在错误消息文件中可以通过{min}和{max}来获取;如@Max有value属性,则在错误消息文件中可以通过{value}来获取。

user.name.length.error=用户名长度必须在{min}-{max}之间

输入测试地址:http://localhost:9080/springmvc-chapter7/validate/length?value=1,将看到我们自定义的错误消息显示出来了。

7.4.2.4、功能处理方法上多个验证参数的处理

当我们在一个功能处理方法上需要验证多个模型对象时,需要通过如下形式来获取验证结果:

@RequestMapping("/validate/multi")
public String multi(
			@Valid @ModelAttribute("a") A a, BindingResult aErrors,
		    @Valid @ModelAttribute("b") B b, BindingResult bErrors) {
		
		if(aErrors.hasErrors()) { //如果a模型对象验证失败
			return "validate/error";
		}
		if(bErrors.hasErrors()) { //如果a模型对象验证失败
			return "validate/error";
		}
		return "redirect:/success";
} 

每一个模型对象后边都需要跟一个Errors或BindingResult对象来保存验证结果,其方法体内部可以使用这两个验证结果对象来选择出错时跳转的页面。详见cn.javass.chapter7.web.controller.validate.MultiModelController。

 

在错误页面,需要针对不同的模型来显示错误消息:

<form:form commandName="a">
	<form:errors path="*" cssStyle="color:red"></form:errors><br/>
</form:form>
<form:form commandName="b">
	<form:errors path="*" cssStyle="color:red"></form:errors><br/>
</form:form> 

 

 

 

 

  • 大小: 19.4 KB
  • 大小: 50.5 KB
53
5
分享到:
评论
101 楼 sp42 2016-01-27  
hibernate-validator-4.3.0.Final.jar 好大 18mb
100 楼 coolhty 2015-10-15  
博主你好,如果一个字符串字段可以为空,如果不为空的话验证长度或使用正则验证要怎么弄?我试了一下如果字符串字段使用了@Length和@Pattern即使在没有使用@NotBlank,也会验证@Length和@Pattern。比如jquery的validation插件就不会这样,如果验证规则没有required的话就字段为空就不会验证其它规则了。
99 楼 louyea 2015-09-15  
涛神,如果我需要自定义一些验证呢,比如和数据库连接,校验是用户名是否存在等,用注解该怎么做呢?菜鸟新手求指点,谢谢  
98 楼 zmjnmy 2015-08-06  
我想知道如果某个字段值的范围另外一张表存储,类似于字典,也就是要查数据库校验,能做到么
97 楼 xrui999 2015-07-18  
<bean id="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <property name="basename" value="classpath:messages"/>
        <property name="fileEncodings" value="utf-8"/>
        <property name="cacheSeconds" value="120"/>
</bean>


<property name="fileEncodings" value="utf-8"/>
这一个现在Spring 4.1 是不是替换为defaultEncoding了。

<bean id="webBindingInitializer"
class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
    <property name="conversionService" ref="conversionService"/>
    <property name="validator" ref="validator"/>
</bean>



conversionService  这个在哪里定义的?
96 楼 dut_wenchao 2015-06-30  
tao哥,啥时候写写Spring Boot啊???万分期待中
95 楼 junfengyi 2015-04-23  
涛神,你要是不忙的话就写个springMvc项目,给我们讲解讲解
94 楼 pudong 2015-01-12  
请教一下,怎么解决XSS的问题,有没有完整的方案或者建议啊!
93 楼 紫_色 2014-12-27  
明明是在github上啊
92 楼 jinnianshilongnian 2014-03-05  
hquxiezk 写道
有个问题请教一下,遇到这么一个问题,数据库有个字段 是float型
配置验证条件为@Digits(integer=2,fraction=2),正常输入12.333这样是可以验证的,
但是如果输入空白 就会Failed to convert property value of type java.lang.String to required type float for property fbReservation; nested exception is java.lang.NumberFormatException: empty String
或者输入非数字,如dd就会 Failed to convert property value of type java.lang.String to required type float for property fbReservation; nested exception is java.lang.NumberFormatException: For input string: "ddd"
这样对用户很不友好,不知道hibernate是否提供注解来,@NotBlank 不能加,一加就会报错。
是不是只能自己自定义验证注解。

你再加个@NotNull 或者 @NotEmpty 试试
91 楼 hquxiezk 2014-03-05  
有个问题请教一下,遇到这么一个问题,数据库有个字段 是float型
配置验证条件为@Digits(integer=2,fraction=2),正常输入12.333这样是可以验证的,
但是如果输入空白 就会Failed to convert property value of type java.lang.String to required type float for property fbReservation; nested exception is java.lang.NumberFormatException: empty String
或者输入非数字,如dd就会 Failed to convert property value of type java.lang.String to required type float for property fbReservation; nested exception is java.lang.NumberFormatException: For input string: "ddd"
这样对用户很不友好,不知道hibernate是否提供注解来,@NotBlank 不能加,一加就会报错。
是不是只能自己自定义验证注解。
90 楼 hellostory 2013-12-16  
你好!请问Ajax提交表单后,验证消息如何国际化,能否给个DEMO,比较现在Ajax使用越来越频繁!
89 楼 yulinling1230 2013-11-25  
涛ge好厉害,这要折腾多长时间才能到涛ge这程度?哎,发了两遍,有敏感词汇
88 楼 ft6216035 2013-11-04  
jinnianshilongnian 写道
ft6216035 写道

<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"/>



你好~!我是个初学者,我还有个问题。以上是配置spring-mvc。
我想自己写个方法把验证信息取出来!想跟现在取message一样。
现在我自己写了个反射把我的javabean上的验证标签全部取出,
// ReloadableResourceBundleMessageSource rrbms = new ReloadableResourceBundleMessageSource();//由于这是工具类,用注视去不到messageSource
// rrbms.setBasename("classpath:/message/ValidationMessages");;
// rrbms.setUseCodeAsDefaultMessage(false);
// rrbms.setDefaultEncoding("UTF-8");
// LocalValidatorFactoryBean lvfb = new LocalValidatorFactoryBean();
// lvfb.setProviderClass(HibernateValidator.class);
// lvfb.setValidationMessageSource(rrbms);
// lvfb.afterPropertiesSet();
ResourceBundleMessageInterpolator rbmi = new ResourceBundleMessageInterpolator(null, true);
ConstraintDescriptorImpl constraintValidatorContext
= new ConstraintDescriptorImpl(annotation, new ConstraintHelper(), null, ElementType.FIELD,null);
LocaleContextMessageInterpolator lcmi = new LocaleContextMessageInterpolator(rbmi);
// resultMessage = rbmi.interpolate(
// message,
// new MessageInterpolatorContext(constraintValidatorContext, null),
// LocaleContextHolder.getLocale());
resultMessage = lcmi.interpolate(message, new MessageInterpolatorContext(constraintValidatorContext, null));
但是这样取message的话,会去hibernate-validator的默认地址。
而现在 我又不太想用getMessage方法
请问还有什么好方法吗?



你好 我想明白了 谢谢你提供的资料
87 楼 ft6216035 2013-11-04  
ft6216035 写道

<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"/>



你好~!我是个初学者,我还有个问题。以上是配置spring-mvc。
我想自己写个方法把验证信息取出来!想跟现在取message一样。
现在我自己写了个反射把我的javabean上的验证标签全部取出,
// ReloadableResourceBundleMessageSource rrbms = new ReloadableResourceBundleMessageSource();//由于这是工具类,用注视去不到messageSource
// rrbms.setBasename("classpath:/message/ValidationMessages");;
// rrbms.setUseCodeAsDefaultMessage(false);
// rrbms.setDefaultEncoding("UTF-8");
// LocalValidatorFactoryBean lvfb = new LocalValidatorFactoryBean();
// lvfb.setProviderClass(HibernateValidator.class);
// lvfb.setValidationMessageSource(rrbms);
// lvfb.afterPropertiesSet();
ResourceBundleMessageInterpolator rbmi = new ResourceBundleMessageInterpolator(null, true);
ConstraintDescriptorImpl constraintValidatorContext
= new ConstraintDescriptorImpl(annotation, new ConstraintHelper(), null, ElementType.FIELD,null);
LocaleContextMessageInterpolator lcmi = new LocaleContextMessageInterpolator(rbmi);
// resultMessage = rbmi.interpolate(
// message,
// new MessageInterpolatorContext(constraintValidatorContext, null),
// LocaleContextHolder.getLocale());
resultMessage = lcmi.interpolate(message, new MessageInterpolatorContext(constraintValidatorContext, null));
但是这样取message的话,会去hibernate-validator的默认地址。
而现在 我又不太想用getMessage方法
请问还有什么好方法吗?
86 楼 ft6216035 2013-11-04  
jinnianshilongnian 写道
ft6216035 写道
你好 我有个问题
<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"/>

报出的错误:
最小不能小于value
个数必须在min和max之间
长度需要在min和max之间


这是怎么回事呢?


终于看明白你的问题了,

看看这篇吧
http://jinnianshilongnian.iteye.com/blog/1879166


哦 明白了 太感谢了
85 楼 jinnianshilongnian 2013-11-04  
ft6216035 写道
你好 我有个问题
<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"/>

报出的错误:
最小不能小于value
个数必须在min和max之间
长度需要在min和max之间


这是怎么回事呢?


终于看明白你的问题了,

看看这篇吧
http://jinnianshilongnian.iteye.com/blog/1879166
84 楼 ft6216035 2013-11-04  
jinnianshilongnian 写道
ft6216035 写道
jinnianshilongnian 写道
ft6216035 写道
你好 我有个问题
<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"/>

报出的错误:
最小不能小于value
个数必须在min和max之间
长度需要在min和max之间


这是怎么回事呢?


把相关配置贴一下


<!-- 只搜索@Controller 标注的类 不搜索其他标注的类 -->
<context:component-scan base-package="cn.com.dl.huachang.dodos"
use-default-filters="false">
<context:include-filter type="annotation"
expression="org.springframework.stereotype.Controller" />
</context:component-scan>
<!-- 国际化配置-->
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basenames">
<list>
<value>classpath:/message/messages</value>
<value>classpath:/message/ValidationMessages</value>
</list>
</property>
<property name="useCodeAsDefaultMessage" value="true"/>
<property name="defaultEncoding" value="UTF-8"/>
</bean>
<!-- Saves a locale change using a session-->
<bean id="localeResolver"  class="org.springframework.web.servlet.i18n.SessionLocaleResolver">
<!-- 默认语言为中文 -->
<property name="defaultLocale" value="zh"/>
</bean>
<!-- 国际化操作 拦截器 必需配置,可以和其它国际化方式通用, 用于监听浏览器端locale的变化 -->
<bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
<property name="paramName" value="ln" />
</bean>

<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping" >
  <property name="interceptors">
   <list>
    <ref bean="localeChangeInterceptor" />
  </list>
  </property>
</bean>

再加上上边已经贴过的代码也就没什么了 在一个就是<!--异常处理--> 但和这个没有关系

你把所有相关的 配置文件、类、错误信息  都发我站内信吧


我dug看了一眼 替换message内容参数的时候,因为ResourceBundle bundle它引起的问题
83 楼 jinnianshilongnian 2013-11-04  
ft6216035 写道
jinnianshilongnian 写道
ft6216035 写道
你好 我有个问题
<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"/>

报出的错误:
最小不能小于value
个数必须在min和max之间
长度需要在min和max之间


这是怎么回事呢?


把相关配置贴一下


<!-- 只搜索@Controller 标注的类 不搜索其他标注的类 -->
<context:component-scan base-package="cn.com.dl.huachang.dodos"
use-default-filters="false">
<context:include-filter type="annotation"
expression="org.springframework.stereotype.Controller" />
</context:component-scan>
<!-- 国际化配置-->
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basenames">
<list>
<value>classpath:/message/messages</value>
<value>classpath:/message/ValidationMessages</value>
</list>
</property>
<property name="useCodeAsDefaultMessage" value="true"/>
<property name="defaultEncoding" value="UTF-8"/>
</bean>
<!-- Saves a locale change using a session-->
<bean id="localeResolver"  class="org.springframework.web.servlet.i18n.SessionLocaleResolver">
<!-- 默认语言为中文 -->
<property name="defaultLocale" value="zh"/>
</bean>
<!-- 国际化操作 拦截器 必需配置,可以和其它国际化方式通用, 用于监听浏览器端locale的变化 -->
<bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
<property name="paramName" value="ln" />
</bean>

<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping" >
  <property name="interceptors">
   <list>
    <ref bean="localeChangeInterceptor" />
  </list>
  </property>
</bean>

再加上上边已经贴过的代码也就没什么了 在一个就是<!--异常处理--> 但和这个没有关系

你把所有相关的 配置文件、类、错误信息  都发我站内信吧
82 楼 ft6216035 2013-11-04  
jinnianshilongnian 写道
ft6216035 写道
你好 我有个问题
<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"/>

报出的错误:
最小不能小于value
个数必须在min和max之间
长度需要在min和max之间


这是怎么回事呢?


把相关配置贴一下


<!-- 只搜索@Controller 标注的类 不搜索其他标注的类 -->
<context:component-scan base-package="cn.com.dl.huachang.dodos"
use-default-filters="false">
<context:include-filter type="annotation"
expression="org.springframework.stereotype.Controller" />
</context:component-scan>
<!-- 国际化配置-->
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basenames">
<list>
<value>classpath:/message/messages</value>
<value>classpath:/message/ValidationMessages</value>
</list>
</property>
<property name="useCodeAsDefaultMessage" value="true"/>
<property name="defaultEncoding" value="UTF-8"/>
</bean>
<!-- Saves a locale change using a session-->
<bean id="localeResolver"  class="org.springframework.web.servlet.i18n.SessionLocaleResolver">
<!-- 默认语言为中文 -->
<property name="defaultLocale" value="zh"/>
</bean>
<!-- 国际化操作 拦截器 必需配置,可以和其它国际化方式通用, 用于监听浏览器端locale的变化 -->
<bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
<property name="paramName" value="ln" />
</bean>

<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping" >
  <property name="interceptors">
   <list>
    <ref bean="localeChangeInterceptor" />
  </list>
  </property>
</bean>

再加上上边已经贴过的代码也就没什么了 在一个就是<!--异常处理--> 但和这个没有关系

相关推荐

    springmvc注解式控制器的数据验证、类型转换及格式化 SpringMVC数据验证

    springmvc注解式控制器的数据验证、类型转换及格式化 SpringMVC数据验证 参数传递

    跟我学SpringMVC 教程

    第七章 注解式控制器的数据验证、类型转换及格式化 SpringMVC数据类型转换 第七章 注解式控制器的数据验证、类型转换及格式化 SpringMVC数据格式化 第七章 注解式控制器的数据验证、类型转换及格式化 SpringMVC...

    跟我学SpringMVC

    第七章 注解式控制器的数据验证、类型转换及格式化 SpringMVC数据类型转换 第七章 注解式控制器的数据验证、类型转换及格式化 SpringMVC数据格式化 第七章 注解式控制器的数据验证、类型转换及格式化 SpringMVC数据...

    SpringMvc开涛.rar

    PDF,源代码 开涛学SpringMVC 第一章源代码下载 第二章 Spring MVC入门 源代码下载 第四章 Controller接口控制器详解 源代码下载 第五章 处理器拦截器详解——跟着...第七章 注解式控制器的数据验证、类型转换及格式化

    SpringMVC数据类型转换超详细介绍

    SpringMVC数据类型转换超详细介绍,注解式控制器的数据验证、类型转换及格式化

    SpringMVC学习文档

    SpringMVC入门、Controller接口详解、注解详解、数据验证、类型转换及格式化等等

    SpringMVC示例

    员工信息、RESTRUL_CRUD_添加操作&表单标签、RESTRUL_CRUD_删除操作&处理静态资源、RESTRUL_CRUD_修改操作、自定义类型转换器、annotation-driven配置、InitBinder注解、数据的格式化、JSR 303数据校验、错误消息的...

    Spring MVC通过添加自定义注解格式化数据的方法

    主要给大家介绍了关于Spring MVC通过添加自定义注解格式化数据的方法,文中先对springmvc 自定义注解 以及自定义注解的解析进行了详细的介绍,相信会对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面...

    SpringMVC Employee Demo

    driven配置、InitBinder注解、数据的格式化、JSR303数据校验、错误消息的显示及国际化、Ajax返回JSON、使用HttpMessageConverter、国际化_通过超链接切换中英文、文件上传、自定义的拦截器、拦截器的零Xml配置、异常...

    Spring、SpringMVC和Mybatis框架整合包

    手把手教你整合最优雅SSM框架:SpringMVC + Spring + MyBatis 博客地址:http://blog.csdn.net/qq598535550/article/details/51703190 我们看招聘信息的时候,经常会看到这一点,需要具备SSH框架的技能;而且在大...

    SpringMVC大威天龙.docx

    SpringMVC是Spring提供的一个强大而灵活的Web框架 借助于注解 SpringMVC提供了几乎是POJO的开发模式 使得控制器的开发和测试更加简单 二 SpringMVC优点 1. 角色划分清晰 2. 分工明确 而且扩展相当灵活 3. 和Spring...

    spring杂谈 作者zhang KaiTao

    1. spring杂谈[原创] 1.1 Spring事务处理时自我调用的解决方案及一些实现方式的风险 ...1.32 Spring3 Web MVC下的数据类型转换(第一篇)——《跟我学Spring3 Web MVC》抢先看 1.33 Spring 注入集合类型

    Spring3_MVC注解教程.ppt

    支持REST风格的URL 添加更多注解,可完全注解驱动 引入HTTP输入输出转换器...和数据转换、格式化、验证框架无缝集成 对静态资源处理提供特殊支持 更加灵活的控制器方法签名,可完全独立于Servlet API

    Spring MVC 3.0实战指南.ppt

    4、数据转换、格式化、校验 5、数据模型控制 6、视图及解析器 7、其它 目录: Spring MVC 3.0新特性 Spring MVC框架结构 Spring MVC框架结构 框架的实现者 目录 HTTP请求映射原理 Spring MVC进行映射的依据 通过URL...

    spring-mvc-learn:spring-mvc学习代码源码-mvc source code

    转换器(转换器)和格式化(Formatter) 转炉 实现转换器接口 在spring-mvc的配置文件中添加bean:org.springframework.context.support.ConversionServiceFactoryBean,注册转换器,添加注释驱动的转换服务属性 ...

    spring mvc 3.2 参考文档

    Spring的视图解析也非常灵活,控制器通常负责准备含有数据的model Map并选择一种视图名称,当然,它也可以直接直接写响应流,并完成该请求。视图名称解析可以根据文件扩展名或者Accept头内容类型协商,通过bean的...

    server-api:SERVER-API 是一个gui的web接口管理工具,基于 swagger-ui 的后台API开源项目,采用SpringMvc+Maven3+Jdk1.7+Tomcat7

    api 是一个GUI的WEB接口管理工具,基于 的后台API开源项目,采用SpringMvc+Maven3+Jdk1.7+Tomcat7,该项目的初衷是为了更好的去发展Swagger-ui与SpringMvc的结合,希望能够更加灵活,轻量化的根据后台不同的数据源...

    report 开源的访问层中间件,基于java平台

    可用于接口的调试及性能的展示,以及访问控制层的使用,简化控制层的繁琐代码,简化spring mvc的配置,剥离的请求前的一系列操作,耦合性低,report是请求通道采用责任链模式设计,轻便可控、扩展性强。report的测试...

    java猜数字源码-eweb4j-framework:简单的Java网络框架

    声明式事务、事务模板、事务嵌套 丰富的DAO封装类 多数据源、表关联 简单的 IOC 容器 MVC、ORM、IOC 可控开关 键值对配置文件支持 国际化支持 让我们看看它是如何做到的。 == 1. 独具特色的 RESTful 路由 == 讨厌 _...

    SSM入门到精通项目实战(附源码)

    掌握SpringMVC的项目整合配置,@Controller,@RequestMapping,@Resource,@PathVariable,@ResponseBody,@ModelAttribute,@CookieValue,@Transactional等注解的使用,json数据传值,国际化,拦截器,权限控制,...

Global site tag (gtag.js) - Google Analytics