1

我正在尝试使用推土机 4.1 在类之间进行映射。我有一个如下所示的源类:

    public class initRequest{
     protected String id;
     protected String[] details
}

我有一个看起来像这样的目标类:

public class initResponse{
       protected String id;
       protected DetailsObject detObj;
}

public class DetailsObject{
 protected List<String>  details;
}

所以基本上我希望将详细信息数组中的字符串填充到详细信息对象的列表中。

我试过这样的映射:

<mapping wildcard="true" >
  <class-a>initRequest</class-a>
  <class-b>initResponse</class-b>   
  <field>
    <a is-accessible="true">details</a>
    <b is-accessible="true">detObj.details</b>
  </field>
</mapping>

但我得到这个错误:

Exception in thread "main" net.sf.dozer.util.mapping.MappingException: java.lang.NoSuchFieldException: detObj.details
    at net.sf.dozer.util.mapping.util.MappingUtils.throwMappingException(MappingUtils.java:91)
    at net.sf.dozer.util.mapping.propertydescriptor.FieldPropertyDescriptor.<init>(FieldPropertyDescriptor.java:43)
    at net.sf.dozer.util.mapping.propertydescriptor.PropertyDescriptorFactory.getPropertyDescriptor(PropertyDescriptorFactory.java:53)
    at net.sf.dozer.util.mapping.fieldmap.FieldMap.getDestPropertyDescriptor(FieldMap.java:370)
    at net.sf.dozer.util.mapping.fieldmap.FieldMap.getDestFieldType(FieldMap.java:103)
    at net.sf.dozer.util.mapping.util.MappingsParser.processMappings(MappingsParser.java:95)
    at net.sf.dozer.util.mapping.util.CustomMappingsLoader.load(CustomMappingsLoader.java:77)
    at net.sf.dozer.util.mapping.DozerBeanMapper.loadCustomMappings(DozerBeanMapper.java:149)
    at net.sf.dozer.util.mapping.DozerBeanMapper.getMappingProcessor(DozerBeanMapper.java:132)
    at net.sf.dozer.util.mapping.DozerBeanMapper.map(DozerBeanMapper.java:94)

我怎样才能映射它以便它工作?

4

7 回答 7

3

这对我有用。我使用的是 5.2.1 版本

 <mapping wildcard="true" >
      <class-a>initRequest</class-a>
      <class-b>initResponse</class-b>   
      <field>
        <a>details</a>
        <b is-accessible="true">detObj.details</b>
      </field>
    </mapping>

请注意,“可访问”不是 . 希望能帮助到你

于 2012-12-08T07:20:19.093 回答
2

问题解决了...

  • is-accesible 允许更新对象,而不管访问修饰符和 getter/setter 的存在(对于使用 JAXB 生成的对象必不可少)

  • 深度映射的“点”符号可用于访问嵌套对象

将两者结合起来是 Dozer 中无法使用的功能(可能在较新的版本中可以使用)

解决方案...修改 xsd 以便不需要深度映射。这不是我理想的解决方案,但比为每个对象编写自定义转换器更好

于 2010-06-17T14:41:07.080 回答
1

在 JaxB 的情况下,用户可以下载并使用生成设置器的插件。有关更多详细信息,请参阅此链接,https://jaxb2-commons.dev.java.net/collection-setter-injector/

于 2010-10-16T14:06:01.193 回答
0

我猜想缺少访问器(getter / setter)。顺便说一句,我认为您还需要为 DetailsObject 提供一个空的构造函数,以便 dozer 可以实例化它。

于 2010-06-10T21:01:53.403 回答
0
<b is-accessible="true">detObj.details</b>

应该替换为

<b is-accessible="true">DetailsObject.details</b>
于 2011-02-16T11:41:15.780 回答
0

虽然您似乎不能同时使用“可访问”和点表示法,但另一种方法是将深度映射分解为更小的映射。

我们使用 JAX-WS 生成的代码遇到了这种情况。您有没有设置方法的列表,在我们的例子中是深度嵌套的。我们通过简单地将大的深度映射分解成更小的映射来找到我们的解决方案,这些映射“走”了我们想要的东西。我试图在我的博客中解释这一点:

http://btarlton.blogspot.com/2014/08/dozer-deep-nestinga-different-approach.html

但诀窍只是通过较小的映射遍历对象树,并在必要时使用 is-accessible="true" 来访问没有设置器的列表,并使用“this”作为属性名称以继续传递源。

希望这可以帮助!

于 2014-08-11T13:36:09.050 回答
0

总而言之,此问题有以下选项 1) 使用 JaxB 插件启用设置器,如 Naveen 所讨论的 2) 对此类属性使用 is-accessible

我相信使用第一种方法会不必要地公开集合/列表的设置器,因为您可能会冒着将它们设置为 null 的风险。

我们决定为这些字段(而不是整个类)启用 is-accessible 以避免任何副作用。

我已经讨论了Dozer Mapping Class 级别的解决方案 is-accessible

于 2015-08-03T06:23:58.063 回答