`
weiqingfei
  • 浏览: 312166 次
  • 性别: Icon_minigender_1
  • 来自: 黑洞
社区版块
存档分类
最新评论

Spring 数据绑定时的类型转换错误

    博客分类:
  • Java
 
阅读更多

在Spring的数据绑定里,可以使用@ModelAttribute把表单绑定到JavaBean上。

但是大家都知道从客户端传过来的数据实际上首先都是字符型的,如果绑定对象JavaBean上有别的类型,那么势必需要进行类型转换。

在这点上Spring做的比较欠缺,在绑定之前并没有进行类型check,硬生生的进行转换。

比如转换为数字或者日期类型时

 

public class PersonForm {

    @Size(min=2, max=30)
    private String name;

    @NumberFormat(pattern="#,###")
    private Integer age;
    
    @DateTimeFormat(pattern="yyyy/MM/dd")
    private Date birthday;

}

 

 

如果输入的根本就不是数字类型,或者输入的日期类型不对的话,那么会打出exception

写道
Failed to convert property value of type [java.lang.String] to required type [java.lang.Integer] for property age; nested exception is java.lang.NumberFormatException

Failed to convert property value of type [java.lang.String] to required type [java.util.Date] for property birthday; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@org.springframework.format.annotation.DateTimeFormat java.util.Date] for value

 

既然无法在绑定前check数据类型或者格式,那么就只能从转换后的exception message上下手了。

上面打出来的信息是默认信息,那么自定义信息的寻找就是以下顺序了

写道
1.: code + "." + object name + "." + field
2.: code + "." + field
3.: code + "." + field type
4.: code

 比如上面的数值类型

写道
typeMismatch.PersonForm.age=PersonForm.age must be Integer
typeMismatch.age=age must be Integer
typeMismatch.java.lang.Integer={0} must be Integer
typeMismatch=convertion error

 如果全系统都是用同一个message的话,就可以用field type类型

写道
typeMismatch.java.lang.Integer={0} must be Integer

 另外补充一下,验证后,如果有错,会把错误信息保存在类FieldError里,并且会把filed的信息作为第一个参数,这个参数的类型是DefaultMessageSourceResolvable。

也就是说,在message的设定里,用{0}就能访问到这个参数,并且因为这个参数本身是DefaultMessageSourceResolvable,同样能在message里定义这个filed的message。

这在多语言里非常有用。

分享到:
评论

相关推荐

    Spring-Reference_zh_CN(Spring中文参考手册)

    7.3.2. Spring里的通知类型 7.3.2.1. 拦截around通知 7.3.2.2. 前置通知 7.3.2.3. 异常通知 7.3.2.4. 后置通知 7.3.2.5. 引入通知 7.4. Spring里的advisor(Advisor) API 7.5. 使用ProxyFactoryBean创建AOP代理 ...

    Spring 2.0 开发参考手册

    7.3.2. Spring里的通知类型 7.4. Spring里的advisor(Advisor) API 7.5. 使用ProxyFactoryBean创建AOP代理 7.5.1. 基础 7.5.2. JavaBean属性 7.5.3. 基于JDK和CGLIB的代理 7.5.4. 对接口进行代理 7.5.5. 对...

    spring chm文档

    7.3.2. Spring里的通知类型 7.4. Spring里的advisor(Advisor) API 7.5. 使用ProxyFactoryBean创建AOP代理 7.5.1. 基础 7.5.2. JavaBean属性 7.5.3. 基于JDK和CGLIB的代理 7.5.4. 对接口进行代理 7.5.5. 对...

    Spring中文帮助文档

    7.3.2. Spring里的通知类型 7.4. Spring里的Advisor API 7.5. 使用ProxyFactoryBean创建AOP代理 7.5.1. 基础 7.5.2. JavaBean属性 7.5.3. 基于JDK和CGLIB的代理 7.5.4. 对接口进行代理 7.5.5. 对类进行代理 ...

    Spring API

    7.3.2. Spring里的通知类型 7.4. Spring里的Advisor API 7.5. 使用ProxyFactoryBean创建AOP代理 7.5.1. 基础 7.5.2. JavaBean属性 7.5.3. 基于JDK和CGLIB的代理 7.5.4. 对接口进行代理 7.5.5. 对类进行代理 ...

    lamp-cloud微服务脚手架

    请求链路追踪,故障快速定位:可以通过调用链结合业务日志快速定位错误信息。 可视化:各个阶段耗时,进行性能分析。 依赖优化:各个调用环节的可用性、梳理服务依赖关系以及优化。 数据分析,优化链路:可以得到...

    千方百计笔试题大全

    53、数据类型之间的转换: 14 54、字符串操作:如何实现字符串的反转及替换? 14 55、编码转换:怎样将GB2312 编码的字符串转换为ISO-8859-1 编码的字符串? 14 56、写一个函数,要求输入一个字符串和一个字符长度,...

    java面试宝典

    53、数据类型之间的转换: 14 54、字符串操作:如何实现字符串的反转及替换? 14 55、编码转换:怎样将GB2312 编码的字符串转换为ISO-8859-1 编码的字符串? 14 56、写一个函数,要求输入一个字符串和一个字符长度,...

    asp.net知识库

    泛型技巧系列:如何提供类型参数之间的转换 C#2.0 - Object Pool 简单实现 Attributes in C# 手痒痒,也来个c# 2.0 object pool 泛型技巧系列:用泛型打造可复用的抽象工厂 体验.net2.0的优雅(四):Provider、策略...

    lamp-cloud微服务脚手架-其他

    请求链路追踪,故障快速定位:可以通过调用链结合业务日志快速定位错误信息。 可视化:各个阶段耗时,进行性能分析。 依赖优化:各个调用环节的可用性、梳理服务依赖关系以及优化。 数据分析,优化链路:可以得到...

Global site tag (gtag.js) - Google Analytics