代码之家  ›  专栏  ›  技术社区  ›  teabot

非平凡推土机映射

  •  5
  • teabot  · 技术社区  · 16 年前

    我正在努力争取 Dozer 屈从于我的意志去做我觉得应该很简单的事情。我有两个相似的模型,我希望在它们之间进行映射,但是一个模型的层次结构比另一个模型的层次结构更深,这在处理集合时给我带来了问题。考虑以下类别:

    源类:

    class Foo {
        String id;
        NameGroup nameGroup; 
        // Setters/Getters
    }
    
    class NameGroup {
        private List<Name> names;
        // Setters/Getters
    }
    
    class Name {
        private String nameValue;
        // Setters/Getters
    }
    

    目标类:

    class Bar {
        private String barId;
        private BarNames barNames;
        // Setters/Getters
    }
    
    class BarNames {
        private List<String> names;
        // Setters/Getters
    }
    

    现在我想要以下单向映射:

    Foo.id -> Bar.barId // Simple enough
    

    但我需要:

    Foo.nameGroup.names.nameValue -> Bar.barNames.names
    

    所以每个 Name 实例在 Foo.nameGroup.names 应导致 String 添加到 BarNames.names 名单。这有可能吗?

    1 回复  |  直到 16 年前
        1
  •  5
  •   pjmyburg    16 年前

    只要您的“name”类包含一个字符串构造函数,就可以很容易地使用Dozer完成这项工作。

    推土机文档中的报价( http://dozer.sourceforge.net/documentation/simpleproperty.html ):

    执行数据类型转换 通过推土机绘图自动 发动机。目前,推土机支持 以下转换类型:(这些 都是双向的)

    串到 复杂类型如果复杂类型 包含字符串构造函数

    ……

    我已经在你的课上测试过这个(我也遇到了同样的问题),它运行得很好。下面是我使用的映射:

    <mapping>
      <class-a>com.test.bar.Bar</class-a>
      <class-b>com.test.foo.Foo</class-b>
      <field>
        <a>barId</a>
        <b>id</b>
      </field>
      <field>
        <a>barNames.names</a>
        <b>nameGroup.names</b>
        <a-deep-index-hint>java.lang.String</a-deep-index-hint>
        <b-deep-index-hint>com.test.foo.Name</b-deep-index-hint>
      </field>
    </mapping>
    
    推荐文章