`
weiqingfei
  • 浏览: 318237 次
  • 性别: 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。

这在多语言里非常有用。

分享到:
评论

相关推荐

    SpringBoot定时任务实现Oracle和mysql数据同步

    4. **数据转换**:根据业务需求,可能需要对查询结果进行处理,比如数据类型转换、格式化等。 5. **插入数据**:在MySQL数据库中,创建相应的表结构,然后使用`PreparedStatement`执行插入操作。如果需要批量插入,...

    spring integration同步数据库数据

    《Spring Integration:同步数据库数据详解》 在现代企业级应用开发中,数据的实时同步是一项至关重要的任务。Spring Integration作为Spring框架的一部分,提供了一种强大的、灵活的方式来实现系统间的集成,包括与...

    spring-batch+quartz处理mysql数据示例

    Spring Batch 是一个全面、强大的批处理框架,它提供了大量用于处理批量数据的功能,包括读取、处理和写入数据,以及事务管理、错误处理等。Spring Batch 的核心组件包括: 1. **Job**: 代表一个完整的批处理任务,...

    springbatch 详解PDF附加 全书源码 压缩包

    4. **ETL 过程**: 在数据仓库项目中,使用 Spring Batch 进行数据抽取、转换和加载。 通过阅读《Spring.Batch批处理框架.pdf》和源码,你将能够掌握 Spring Batch 的核心概念和实践技巧,为你的企业级应用开发带来...

    Spring Batch in Action英文pdf版

    Spring Batch是一个开源的轻量级、全面的批处理框架,它是为了解决企业应用中的大规模数据处理需求而设计的。Spring Batch in Action是一本专注于Spring Batch框架的书籍,由Arnaud Cogoluègnes、Thierry Templier...

    spring batch指南

    2. **跳过与恢复(Skip and Retry)**:遇到错误时,Spring Batch能自动跳过错误记录并继续执行,同时记录以便后续恢复。 3. **跳转与决策(Jump and Decision)**:根据处理结果动态决定下一步的执行路径。 4. **...

    Pro Spring 3.pdf

    Spring的验证与类型转换功能,允许开发者定义复杂的验证规则和自定义的类型转换器,从而确保输入数据的有效性和一致性。 ### 任务调度 Spring框架支持任务调度,这使得定时执行任务变得非常简单,无论是简单的定时...

    spring-batch.jar

    在Java开发中,批处理通常用于处理大量数据,如数据库导入导出、定时任务、数据清洗等场景。`spring-batch.jar`是Spring Batch的核心库,包含了执行批处理任务所需的所有组件。 1. **Spring Batch 概述** Spring ...

    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源码阅读——1.spring-core-3.2.9

    3. **类型转换系统**:`convert.xml`涉及Spring的类型转换系统,它允许在不同数据类型间进行安全转换,如String到Integer。这在处理用户输入或从不同来源获取数据时非常有用。 4. **环境与配置**:在`env.xml`中,...

    Spring Batch学习demo项目源码

    Spring Batch 是一个强大的、全面的批处理框架,用于处理大量数据。它被设计为高度可配置,能够处理各种批量处理任务,包括数据导入导出、日志分析、报表生成等。这个"Spring Batch学习demo项目源码"是针对Spring ...

    [Pro.Spring.3(2012)].Clarence.Ho.文字版

    该章节介绍了Spring框架如何支持数据类型转换、格式化和校验,帮助开发者在数据输入和输出过程中进行有效的数据处理。读者将学会如何利用Spring的类型转换器、格式化器和校验器来提高数据的准确性和用户体验。 ### ...

    spring-batch-2.1.9

    2. **跳过与恢复**:遇到错误时,Spring Batch 可以配置跳过错误记录,继续处理后续数据,同时也支持故障恢复,从上次失败的地方重新开始。 3. **跟踪与日志**:Spring Batch 提供了详细的工作项跟踪和日志记录,...

    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. 对...

    boot+mybatis、mybatis中枚举转换器、前后端分离项目统一返回格式、boot集成quraz框架实现定时任务

    在本项目中,我们主要探讨了四个核心主题:Spring Boot与MyBatis的整合、MyBatis中的枚举转换器、前后端分离项目的统一JSON返回格式以及Spring Boot集成Quartz框架来实现定时任务。让我们逐一深入这些关键知识点。 ...

    基于kettle实现的web版数据集成平台,致力于提供web可拖拽的数据集成平台。.zip

    2. 转换和作业设计:使用图形化界面构建数据清洗、转换流程,以及定时任务设置。 3. 执行和监控:实时查看ETL作业的执行状态,监控性能指标,如数据量、速度和错误记录。 4. 版本控制:保存并管理不同版本的转换和...

    Spring Boot 学习笔记完整教程.docx

    - **使用 Spring Task**:配置定时任务,利用 `@Scheduled` 注解定义周期性任务。 13. **普通类调用 Bean** - **非 Spring 容器中的 Bean 访问**:在非 Spring 管理的类中使用 `ApplicationContextAware` 获取 ...

    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 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. 对...

Global site tag (gtag.js) - Google Analytics