Java 推土机-映射集合

Java 推土机-映射集合,java,jaxb,dozer,Java,Jaxb,Dozer,我有一个类似于以下两个类的场景: public class Person { private String name; private Set<Person> familyMembers; //constructors & getters and setters } 我实际场景中的目标类是由JAXB生成的(使用我创建的XSD)。XSD是规定的,我无法真正更改它们,因此无法更改目标类。我目前能够映射映射XML文件中的原语,但无法映射集合 你知道如何使用

我有一个类似于以下两个类的场景:

public class Person {
    private String name;
    private Set<Person> familyMembers;
    //constructors & getters and setters
}
我实际场景中的目标类是由JAXB生成的(使用我创建的XSD)。XSD是规定的,我无法真正更改它们,因此无法更改目标类。我目前能够映射映射XML文件中的原语,但无法映射集合


你知道如何使用推土机将
Person
的对象映射到
PersonPrime
类型的对象吗?

以下映射有效


人
人格素
名称
人名
家庭成员
家庭成员。家庭成员

默认情况下,JaxB不会为“FamilyMembers”类型内的集合生成setter。当Dozer试图调用不存在的setter时,这将导致Dozer内部(org.Dozer.util.ReflectionUtils.java:323,在Dozer 5.4.0中)出现空指针异常。为了避免这种情况,您需要在集合字段上设置is accessible true,这将导致它直接设置familyMembers.familyMembers字段。因此,以下修改映射谁应该工作:

<mapping>
  <class-a>Person</class-a>
  <class-b>PersonPrime</class-b>
  <field>
    <a>name</a>
    <b>personName</b>
  </field>
  <field>
    <a>familyMembers</a>
    <b is-accessible="true">familyMembers.familyMembers</b>
  </field>
</mapping>

人
人格素
名称
人名
家庭成员
家庭成员。家庭成员

IMHO您将需要使用自定义转换器谢谢,将
is accessible=“true”
添加到JAXB集合端,并按预期工作。但是您可能会考虑使用JAXBEAN工厂来做JAXB类,因为有些事情可能会出错。为此,添加
,这节省了很多时间,因为我正在努力将bean中的列表分配给jaxb列表。请看,JAXB不会为列表生成setter,因此可访问性是唯一的救星。我的示例:List from to List lmsvacctdttlsllrec body.vAcctDtlsAddRequest.vAcctDtlsAddRq.lmsvacctdttlsllrec
<mapping>
  <class-a>Person</class-a>
  <class-b>PersonPrime</class-b>
  <field>
    <a>name</a>
    <b>personName</b>
  </field>
  <field>
    <a>familyMembers</a>
    <b is-accessible="true">familyMembers.familyMembers</b>
  </field>
</mapping>