使用 BeanUtils.copyProperties 时如何保持数值为 null?

Posted

技术标签:

【中文标题】使用 BeanUtils.copyProperties 时如何保持数值为 null?【英文标题】:How to maintain null for numeric values when using BeanUtils.copyProperties? 【发布时间】:2009-06-16 22:46:00 【问题描述】:

我有一个允许空值的数字数据库字段(SQL Server 2000 中的numeric(3)),而空值是我首选的“无值”值。

该字段映射到 Hibernate 中的非原始 java Long 类:

<property column="my_column" name="my_column" type="java.lang.Long" not-null="false" />

在我的 struts 表单和 bean 中,该字段都设置为 java.lang.Long。首次创建 Struts 表单时,我已验证该属性返回 null。创建 bean 时(从数据库中提取),我已验证该属性返回 null。但是,在使用BeanUtils.copyProperties() 使用 bean 值预填充 Struts 表单后,该属性返回 0,如果我继续保存表单,数据库将具有 0 值。

我是否使用了错误的类型或类型组合(在数据库和/或 Hibernate/Java 中)来维护数字字段的空值?我应该将数字 sql 类型映射到不同的 Java 类,如 BigDecimal 吗?在研究中,我发现提到了 Converter 类。我是否需要创建这样一个类来帮助BeanUtils 正确维护空值?

【问题讨论】:

【参考方案1】:

您需要在 BeanUtils 中注册一个默认值为 null 的 LongConverter。

ConvertUtils.register(new LongConverter(null), Long.class); 

【讨论】:

谢谢。我在复制属性调用之前添加了ConvertUtils.register(new LongConverter(null), Long.class); 并修复了它。但是,这是注册 Long 转换器的最佳位置吗?根据我的阅读,转换器注册是全球性的,所以应该在其他地方注册,如果是,在哪里注册? 我将注册调用移至应用程序的初始化 servlet,因此它现在可以在全球范围内工作。感谢您的帮助。 听起来不错,抱歉没有回复。 请编辑答案。它是 ConvertUtils 但 BeanUtils。 ConvertUtils.register(new LongConverter(null), Long.class);【参考方案2】:

在 web.xml 中使用下面的代码

<init-param>
      <param-name>convertNull</param-name>
      <param-value>true</param-value>
</init-param>

所以这会将默认的 0 转换为 null。

【讨论】:

以上是关于使用 BeanUtils.copyProperties 时如何保持数值为 null?的主要内容,如果未能解决你的问题,请参考以下文章

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)