【问题标题】:Dozer deep mapping not working推土机深度映射不起作用
【发布时间】:2010-06-10 19:59:53
【问题描述】:

我正在尝试使用 dozer 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)

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

【问题讨论】:

    标签: java xml jaxb dozer jax-rpc


    【解决方案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>
    

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

    【讨论】:

      【解决方案2】:

      问题解决了……

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

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

      将两者结合是 Dozer 中不支持的功能(可能在较新的版本中支持)

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

      【讨论】:

      • 您没有使用 JAXB 生成的对象的 getter 和 setter 吗?我有
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • DetailsObject 是使用 JAXB 生成的。它唯一的方法是: public List getDetails() { if (details == null) { details = new ArrayList(); } 返回 this.details;我不想更改生成的代码。有什么解决办法吗?
        • 鉴于您的映射无法工作,因为您的目标类中没有提供设置器。但是......也许你可以看看这里:dozer.sourceforge.net/documentation/xmlbeans.html 它解释了如何使用 xmlbeans 以及 jaxb 对象进行映射
        【解决方案5】:
        <b is-accessible="true">detObj.details</b>
        

        应该替换为

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

        【讨论】:

        • 请尝试格式化答案并添加一些详细信息
        【解决方案6】:

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

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

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

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

        希望这会有所帮助!

        【讨论】:

          【解决方案7】:

          总结一下这个问题有以下选项 1) 使用 JaxB 插件启用设置器,如 Naveen 所述 2) 对此类属性使用 is-accessible

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

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

          我已经在Dozer Mapping Class level is-accessible讨论了解决方案

          【讨论】:

            猜你喜欢
            • 2011-04-30
            • 1970-01-01
            • 1970-01-01
            • 2012-12-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多