【问题标题】:How can I flatten a complex Java Bean and convert between the flat Bean and the original?如何展平复杂的 Java Bean 并在平面 Bean 和原始 Bean 之间进行转换?
【发布时间】:2016-02-29 18:11:49
【问题描述】:

我有一个包含数百个字段的 Java bean,每个字段都可以递归地成为不同的字段和更多子 bean。我的问题是我需要从具有字段名称/值对的平面文件中加载值,但我没有字段的完全限定名称。

假设我有类 A 和 B。A 包含 B 的一个实例,B 包含一个名为 f 的字符串字段,它存储值 s。如果每个类的实例只是小写的类名,那么这个数据结构中f的全称就是a.b.f

实际上,我需要执行如下所示的操作,只是我实际上是在使用反射,因为我从文件中读取了字段名称。

... a.getB().setF(x); // 这过于简单化了;如果 a.b 为空,我还需要创建并分配 B 的实例。

但是,我真正想做的是一个简单的 a.setF(s)。

假设所有 bean 中没有重复的字段,我如何生成扁平 bean 并在两者之间进行转换?

一位同事提到Dozer,听起来它可以用于从扁平bean格式到分层bean格式的转换,但看起来我仍然需要生成扁平bean和映射。由于有数百个字段和数十个 bean,这绝对是我不想手动做的事情。

【问题讨论】:

  • 反射和一些代码生成?
  • @DaveNewton 我忘了提,但这也是我目前在想的;我不确定是否已经有一些现成的库或代码,所以我不会重新发明轮子。
  • @rob 你能分享你的源平面数据文件的例子吗?这里的传统名称是什么?可能的数据格式有哪些?
  • 如果您出于任何原因想要手动操作here's how converting to flat bean (map) can work
  • 您可以尝试以下任何一种方法,也许:simple.sourceforge.netbeanio.org 或者只是使用反射并自己动手。

标签: java javabeans dozer


【解决方案1】:

我认为您的扁平化问题可以通过这些步骤解决

  1. 将所有数据以简单的Map<String, String> 加载到内存中。通常的 java Properties 可以用于此。
  2. Dozer Java API 的帮助下扫描地图键并自动准备推土机的地图配置(例如名称builder)。例如。为此自动创建BeanMappingBuilder
  3. 调用 Dozer 进行实际转换:

DozerBeanMapper mapper = new DozerBeanMapper(); mapper.addMapping(builder); HugeDestinationalBean result = mapper.map(properties, HugeDestinationalBean.class);

这里HugeDestinationalBean是你的目标bean。

显然,最棘手的部分是第 2 步。它的实现取决于源数据文件中的常规字段命名和目标 bean 的结构。

或者,在通常的 Java 反射的基础上手动实现第 2 步。

【讨论】:

  • 我对推土机不是很熟悉;您能否扩展您的示例以将数据从平面文件读取到嵌套 bean 中?
猜你喜欢
  • 2015-09-17
  • 2014-10-26
  • 2011-05-16
  • 2015-03-03
  • 1970-01-01
  • 1970-01-01
  • 2015-01-14
  • 2011-10-11
  • 2011-06-10
相关资源
最近更新 更多