Dozer深度映射将<complexobject>设置为Set <string> </string> </complexobject>

时间:2013-01-08 10:16:31

标签: java mapping dozer

免责声明:此处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
}

现在,我将ComplexObject映射到Target,其中Target具有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>


如果我将toString的{​​{1}}方法修改为

,我就可以实现目标
AnotherComplexObject

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

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

1 个答案:

答案 0 :(得分:3)

也许我的answer可能对您有用:

我认为,你可以编写这样的映射

<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的字符串字段并将其作为String返回。

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

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

进入推土机GitHub