【问题标题】:How to map a bean into a java.util.Map using MapStruct?如何使用 MapStruct 将 bean 映射到 java.util.Map?
【发布时间】:2016-04-06 05:34:42
【问题描述】:

我想使用MapStruct 将一个bean 类的字段映射到一个类字典类。我的源类是标准 bean(简化示例):

public class Bean {
    private String a;
    private String b;

    public String getA() {
        return a;
    }

    public void setA(String a) {
        this.a = a;
    }

    public String getB() {
        return b;
    }

    public void setB(String b) {
        this.b = b;
    }
}

现在我想将这些字段映射到类似 Map 的容器中:

public class Dict {

    public enum Tag {
        A,
        B
    }

    private Map<Tag, String> dict = new HashMap<>();

    public String getEntry(Tag tag) {
        return dict.get(tag);
    }

    public void setEntry(Tag tag, String s) {
        dict.put(tag, s);
    }
}

换句话说,我希望MapStruct 生成以下内容:

    target.setEntry(Dict.Tag.A, source.getA());
    target.setEntry(Dict.Tag.B, source.getB());

我在 MapStruct documentation 中找不到类似的东西。获取映射源(嵌套源、表达式)有很大的灵活性,但对于目标,我只能看到 target = "propertyname" 表示法,这并没有太多的灵活性空间。

映射到java.util.Map 的最佳解决方案是什么?

【问题讨论】:

  • 用 JMapper 很容易实现这个映射,但是超出了这个线程的范围,如果你有兴趣打开一个带有明确 JMapper 请求的新问题或github 上的问题
  • @Alessandro 上次我们查看 JMapper 时,它使用字节码增强来进行映射。我喜欢 MapStruct 的地方在于它可以生成快速且易于调试的代码。

标签: java object-object-mapping mapstruct


【解决方案1】:

MapStruct 目前不支持这种映射。我们之前考虑过,但还没有实现它。你能在我们的issue tracker开票吗?

【讨论】:

  • 感谢您的快速回答!根据要求,我开了一张票:717
【解决方案2】:

您可以在 MapStruct 映射器中使用 Jackson 对象映射器将对象转换为 Map。

@Mapper
public interface ModelMapper {

  ObjectMapper OBJECT_MAPPER = new ObjectMapper();

  default HashMap<String, Object> toMap(Object filter) {
    TypeFactory typeFactory = OBJECT_MAPPER.getTypeFactory();
    return OBJECT_MAPPER.convertValue(filter, typeFactory.constructMapType(Map.class, String.class, Object.class));
  }
}

【讨论】:

  • 使用 ObjectMapper 的一个缺点是它使用 jsonproperties 而不是类字段。这会更改地图键的名称。
猜你喜欢
  • 2017-07-02
  • 2018-09-14
  • 2018-05-07
  • 1970-01-01
  • 1970-01-01
  • 2012-07-22
  • 1970-01-01
  • 2017-09-07
  • 2020-07-07
相关资源
最近更新 更多