4

免责声明:这里已经问过同样的问题Mapping deep properties with intermediate collections in dozer,但它没有可接受的答案(对于我的情况也没有正确的答案)。

所以这个问题。我有一个由 ComplexObject 组成的领域,如下所示

public class ComplexObject {
  private Set<AnotherComplexObject> inner;
  ... //other fields, setters and getters
}
public Class AnotherComplexObject {
  private String property;
  ... //other fields, setters and getters
}

现在,我正在映射ComplexObjectTargetTarget 具有Set<String>属性的位置。

public class Target {
  private Set<String> targetString;
  ... //other fields, setters and getters
}

我想将每个 ComplexObject inner.property 映射到一个 Target targetString 上。语义上看起来像的东西(这当然不起作用,属性不是 Set 的成员,并且 Dozer 会生成 MappingException):

<mapping>
  <class-a>ComplexObject</class-a>
  <class-b>Target</class-b>
  <field>
    <a>inner.property</a>
    <b>targetString</b>
  </field>
</mapping>


如果我修改to的toString方法,我可以实现我的目标AnotherComplexObject

public class AnotherComplexObject {
  public String toString(){
    return property;
  }
}

然后,Dozer 将检测到源 Set 是“类型”AnotherComplexObject,而目标 Set 是 String,并在转换过程中使用 toString 方法。不幸的是,这不是一个很好的解决方案,因为我需要在我的 POJO 中使用一个方法来让 Dozer 进行转换。

起作用的是编写一个自定义转换器,它覆盖转换方法以检查源是否为 Set,然后假设集合中的对象是 AnotherComplexObject 并从此时开始进行转换,但不知何故,我觉得这不是最好的,也不是更多优雅的解决方案。
关于如何解决这个问题的任何其他想法?

4

1 回答 1

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

于 2013-01-09T14:50:23.797 回答