Java 使用推土机中的中间集合映射深层属性

Java 使用推土机中的中间集合映射深层属性,java,mapping,dozer,Java,Mapping,Dozer,假设我有以下课程 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{ 私有列表f

假设我有以下课程

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{
私有列表foos=newarraylist();
}
公开课Foo{
私有字符串;
}
公共类目标{
private List fooStrings=new ArrayList();
}
在给定一个Baz的情况下,我是否可以使用任何映射将其映射到目标类,并获取Baz中foo中包含的字符串列表?以下映射不起作用

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

巴兹
目标
foos.string
食物串

因为string不是foos(属于List类型)的属性。我本以为Dozer会足够聪明,如果它在深度映射中遇到一个集合,并且目标也是一个集合,那么它能够将深度属性名称一分为二,并在集合中迭代,以从集合成员中获取深度映射的子部分。显然不是。除了请求推土机的功能外,还有其他解决方案吗?

您可以自己编写


这就解释了为什么Dozer不能像您期望的那样处理这个问题,因为在运行时它没有关于
列表foos
的类型信息,也不能保证列表中的每个
对象实际上都是
Foo

我想您可以不用自定义转换器来处理它

重写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>

Baz的完全限定名(带包名)
目标也一样
福斯
食物串
福
java.lang.String

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

<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>

巴兹
目标

确保列表中的每个项目实际上都是一个Foo并不是dozer的工作。事实上,它甚至不必关心这些。它需要知道的是列表的成员项有一个属性“string”,这取决于我,开发人员来确保始终是这样。为旧版本的推土机编写自定义转换器是我一直在做的事情。我希望在Dozer的最后2个主要版本中,有人能够解决这个相当明显的(IMHO)用例。这是一个非常非通用的解决方案。它只允许您为每个类层次结构选择一个属性来执行此操作,并终止现有的toString()功能,这对于调试来说通常非常有价值。我的问题如何与我3年后提出的问题重复?可能是重复的@杰里科,我很抱歉给你带来困惑。Stackoverflow仅允许在另一个帖子包含接受答案时将帖子标记为重复。
<mapping>
  <class-a>Foo</class-a>
  <class-b>String</class-b>
  <field>
    <a>string</a>
  </field>
</mapping>