推土机深映射不工作(Dozer deep mapping not working)

2019-09-29 01:44发布

我试图用推土机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)

我怎样才能使这个映射,它的工作原理?

Answer 1:

这对我的作品。 我使用的版本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>

请注意,“是-accessable”不需要。 希望能帮助到你



Answer 2:

问题解决了...

  • 是-入店允许对象无论(使用JAXB的对象必需生成)被更新访问修饰符和getter / setter方法的存在的

  • “点”符号深测绘工作访问嵌套对象

两者结合是一种功能,不推土机工作(也许它在一个更新的版本)

解决方案...修改使得不需要深映射的XSD。 这不是我的理想解决方案,但它不是写一个自定义转换器为每个对象更好



Answer 3:

在JAXB的情况下,使用可以下载和使用该插件生成的制定者。 请参阅此链接了解更多详情, https://jaxb2-commons.dev.java.net/collection-setter-injector/



Answer 4:

我猜想,存取(的getter / setter)失踪。 顺便说一句,我认为你还需要为DetailsObject提供一个空的构造,从而可以推土机它实例化。



Answer 5:

<b is-accessible="true">detObj.details</b>

应改为

<b is-accessible="true">DetailsObject.details</b>


Answer 6:

虽然它似乎你cannnot使用“是可访问”和点符号一起的另一种方法是打破你深深映射成更小的映射。

我们就遇到了这个情况与JAX-WS生成的代码。 您有没有setter方法,并在我们的情况进行了深入嵌套的列表。 我们发现我们的解决方案通过简单地打破了深大映射成更小的映射,说:“走了”我们的方式,我们想要的东西。 我试着在这里我的博客来解释这一点:

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

但关键是仅仅通过较小的映射走对象树和使用是可访问=“真”在必要的时候,没有setter和使用“本”为属性的名称,以保持沿着通过源访问列表。

希望这可以帮助!



Answer 7:

总结有此问题1)使用JAXB撑着,使制定者由纳文中讨论下面的选项)采用的是可访问的这种特性

我相信,使用第一种方法不必要的暴露对集合/列表,你可以用空设置它们的风险制定者。

我们决定启用这些字段是可访问的(而不是整个班级),以避免任何副作用。

我已经讨论了解决方案推土机映射类电平是可访问的



文章来源: Dozer deep mapping not working