【问题标题】:Mapping deep properties with intermediate collections in dozer在推土机中使用中间集合映射深层属性
【发布时间】:2011-01-12 21:24:36
【问题描述】:

假设我有以下课程

public class Baz {
  private List<Foo> foos = new ArrayList<Foo>();
}

public class Foo {
  private String string;
}

public class Target {
  private List<String> fooStrings = new ArrayList<String>();
}

有没有我可以使用的映射,给定一个 Baz,将它映射到目标类并获取 Baz 中 foo 中包含的字符串列表?以下映射不起作用

<mapping>
  <class-a>Baz</class-a>
  <class-b>Target</class-b>
  <field>
    <a>foos.string</a>
    <b>fooStrings</b>
  </field>
</mapping>

因为 string 不是 foos 的属性(它是 List 类型)。我原以为 Dozer 会足够聪明,如果它在深度映射中遇到一个集合,并且目标也是一个集合,那么它能够将深度属性名称分成两个并遍历集合以获取子部分来自集合成员的深度映射。显然不是。有没有没有提出 Dozer 的功能请求的解决方案?

【问题讨论】:

  • 我的问题与我 3 年后提出的问题有何重复?
  • 可能被Dozer deep mapping Set<ComplexObject> to Set<String> 复制。 @Jherico 我很抱歉造成混乱。 Stackoverflow 仅允许在另一个帖子包含已接受的答案时将其标记为重复。

标签: java mapping dozer


【解决方案1】:

你总是可以写自己的CustomConverter

Dozer 无法按预期处理这个问题是有道理的,因为在运行时它没有关于 List foos 的类型信息,并且不能保证列表中的每个 Object 实际上都是 Foo .

【讨论】:

  • 确保 List 中的每个项目实际上都是 Foo 并不是推土机的工作。事实上,它甚至不必关心这些。它只需要知道列表的成员项具有属性“字符串”,这取决于我,开发人员确保始终如此。我一直在为旧版本的 Dozer 编写自定义转换器。我希望在 Dozer 的最后 2 个主要版本中,有人会解决这个相当明显(恕我直言)的用例。
【解决方案2】:

我认为您可以在没有自定义转换器的情况下做到这一点。

重写 Foo 类的 toString() 方法,如下所示:

@Override
public String toString(){
return this.getString(); //assuming string property has a getter method. if not,write this.string

现在是以下映射:

<mapping>
<class-a>fully qualified name of Baz(with package name)</class-a>
<class-b>same for Target</class-b>
<field>
   <a>foos</a>
   <b>fooStrings</b>
   <a-hint>foo</a-hint>
   <b-hint>java.lang.String</b-hint>
</field>
</mapping>

【讨论】:

  • 这是一个非常不通用的解决方案。它只允许您为每个类 hierarchy 选择一个属性来执行此操作,并取消现有的 toString() 功能,这通常对调试非常有价值。
【解决方案3】:

我想,你可以写出这样的映射

<mapping>
  <class-a>Baz</class-a>
  <class-b>Target</class-b>
  <field>
    <a>foos</a>
    <b>fooStrings</b>
  </field>
</mapping>

<custom-converters> 
  <converter type="CustomFooConverter">
    <class-a>
      Foo
    </class-a>
    <class-b>
      String
    </class-b>
  </converter>
</custom-converters>

并实现 CustomFooConverter 获取 foo 的字符串字段并将其作为字符串返回。

我认为您可以发布功能请求以支持映射到原语

<mapping>
  <class-a>Foo</class-a>
  <class-b>String</class-b>
  <field>
    <a>string</a>
  </field>
</mapping>

进入推土机GitHub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多