使用 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有三种方式(不使用,动态使用,静态使用,默认是动态使用)