【问题标题】:Dozer deep mapping Set<ComplexObject> to Set<String>推土机深度映射 Set<ComplexObject> 到 Set<String>
【发布时间】:2012-12-22 04:06:59
【问题描述】:

免责声明:Mapping deep properties with intermediate collections in dozer 已在此处提出了相同的问题,但没有可接受的答案(对于我的情况也没有正确的答案)。

所以这个问题。我有一个由 ComplexObject 组成的领域,如下所示

public class ComplexObject {
  private Set<AnotherComplexObject> inner;
  ... //other fields, setters and getters
}
public Class AnotherComplexObject {
  private String property;
  ... //other fields, setters and getters
}

现在,我将 ComplexObject 映射到 Target,其中 Target 有一个 Set&lt;String&gt; 属性。

public class Target {
  private Set<String> targetString;
  ... //other fields, setters and getters
}

我想将每个 ComplexObject inner.property 映射到一个 Target 目标字符串。语义上看起来像的东西(这当然不起作用,属性不是 Set 的成员并且 Dozer 会生成 MappingException):

<mapping>
  <class-a>ComplexObject</class-a>
  <class-b>Target</class-b>
  <field>
    <a>inner.property</a>
    <b>targetString</b>
  </field>
</mapping>


如果我将AnotherComplexObjecttoString 方法修改为

,我可以实现我的目标
public class AnotherComplexObject {
  public String toString(){
    return property;
  }
}

然后,Dozer 将检测到源 Set 是“类型”AnotherComplexObject,而目标 Set 是 String,并在转换过程中使用 toString 方法。不幸的是,这不是一个很好的解决方案,因为我需要在我的 POJO 中使用一个方法来让 Dozer 进行转换。

起作用的是编写一个自定义转换器,它覆盖转换方法以检查源是否为 Set,然后假设集合中的对象是 AnotherComplexObject 并从此时开始进行转换,但不知何故,我觉得这不是最好的,也不是更多优雅的解决方案。
关于如何解决这个问题的任何其他想法?

【问题讨论】:

    标签: java mapping dozer


    【解决方案1】:

    也许我的answer 对你有用:

    我想,你可以写出这样的映射

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

    并实现 CustomFooConverter 获取 foo 的字符串字段并将其作为字符串返回。

    我认为您可以发布功能请求以支持映射到原语

    <mapping>
      <class-a>Foo</class-a>
      <class-b>String</class-b>
      <field>
        <a>string</a>
      </field>
    </mapping>
    

    进入推土机GitHub

    【讨论】:

    • @Dmitry,实际上,我使用的不是 Dozer 提供的 XML 映射,而是它的 API。我尝试了您建议的映射,但遇到了 MappingException。我使用的 API 映射:mapping(Baz.class, Target.class).fields(foos,foosString,FieldsMappingOptions.customConverter(CustomConverter))。这与您的xml具有相同的含义,对吗?例外:Destination Type (java.util.Set) is not accepted by this Custom Converter (CustomConverter)。转换器:public class CustomConverter extends DozerConverter&lt;Foo, String&gt;。我想我会使用 XML 配置获得相同的结果
    • @mardavi 不,您的映射不正确。您为 set 字段设置了自定义转换器,您不能这样做,dozer 会自动将 set 转换为 set。我设置了一个从类 Foo 到类 String 的自定义转换器,它甚至是另一种类型的转换器。顺便说一句,不幸的是,据我所知,您无法通过基于代码的配置来设置类级别的自定义转换器,因此您无法像我在 xml config 中那样做
    • @Dmitry,你是对的!我最终得到了那个不起作用的配置,因为我无法使用 API 设置类级转换器。然后在我之前的评论中我忘记了这个原因!谢谢!
    • @mardavi 欢迎您。我们将try 在下一个 5.5.0 Dozer 版本中实现基于代码的类级自定义转换器配置。
    • @mardavi 如果对您有帮助,请将我的回答标记为解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多