如何展平复杂的Java Bean并在平面Bean和原始Bean之间进行转换?

时间:2016-02-29 18:11:50

标签: java javabeans dozer

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

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

实际上,我需要做一些如下所示的事情,因为我从文件中读取了字段名称,所以我实际上只使用了反射。

... a.getB()SETF(X)。 //这是一个过于简单化的如果a.b为null,我还需要创建并分配B的实例。

然而,我真正希望能做的是一个简单的a.setF(s)。

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

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

1 个答案:

答案 0 :(得分:0)

我认为你的扁平化问题可以在这些步骤中解决

  1. 将所有数据以简单的Map<String, String>加载到内存中。通常的java Properties可用于此目的。
  2. 扫描地图键并在Dozer Java API的帮助下自动在映射器配置中准备Dozer(例如名称为builder)。例如。为此自动创建BeanMappingBuilder
  3. 致电Dozer进行真正的转换:
  4. DozerBeanMapper mapper = new DozerBeanMapper(); mapper.addMapping(builder); HugeDestinationalBean result = mapper.map(properties, HugeDestinationalBean.class);

    此处HugeDestinationalBean是您的目标bean。

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

    或者,在通常的Java Reflection的基础上手动实现步骤2。