【问题标题】:Mapping a String to a Map via Dozer通过 Dozer 将字符串映射到地图
【发布时间】:2016-04-04 20:09:24
【问题描述】:

我有一个类,我们称它为带有 Map 字段的 A,它转换为 B 类,用于数据库存储/检索,其中该字段映射到字符串。当从 A 到 B 完美时,映射工作。但是,当从 B 到 A 时,我得到一个 IllegalArgument 异常,它表示它不能将字符串转换为映射。让我感到困惑,因为Dozer's documentation 说这在它所说的地方确实有效:

数据类型转换由 Dozer 映射引擎自动执行。目前,Dozer 支持以下几种类型的转换:(这些都是双向的)

然后它继续列出 String to Map 作为可能的事情之一。

我在这里缺少什么,或者我需要做些什么特别的事情?我的文件如下所示:

public class ClassA {
  Map<String, String> field;

  public Map<String, String> getField() {
      return field;
  }
  public void setField(
          Map<String, String> field) {
      this.field = field;
  }
}

public class ClassB {
  String field;

  public String getField() {
      return field;
  }
  public void setField(String field) {
      this.field = field;
  }
}

<mapping>
    <class-a>com.fake.company.name.ClassA</class-a>
    <class-b>com.fake.company.name.ClassB</class-b>
</mapping>

【问题讨论】:

  • 非常有趣。可能他们的意思是“地图到地图”,因为我在那个列表中看不到这样的东西,这绝对是可能的。
  • 我提出了一个问题 - github.com/DozerMapper/dozer/issues/283。显然映射至少不是自动的。
  • @ShireResident 不确定这是否值得作为 Marti 指出的问题,解决方案是简单地显式声明该字段。

标签: java dozer


【解决方案1】:

Map Based Properties section (classes used in documentation) 看来,需要显式映射字段,因为字段名称将用作映射的键​​。

<mapping>
  <class-a>com.fake.company.name.ClassA</class-a>
  <class-b>com.fake.company.name.ClassB</class-b>    
  <field>
    <a>field</a>
    <b>field</b>
  </field>
</mapping>   

您可以像这样为键使用不同的值

<a key="someKeyValue">field</a>

但是,如果您的地图有多个键值对,您可能需要一个自定义转换器 (see here for details),否则 Dozer 不知道如何从字符串重建原始地图。

【讨论】:

  • 这行得通,它不再给我异常,事实上它确实很好地重建了地图,即使有多个键值对!但是,由于某种原因,现在从 Map 转换为 String 会导致结果为 null。
猜你喜欢
  • 2012-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多