9

我目前有一个Map<String, String>包含表单中的值,key = value我想将它们“扩展”为一个真实的对象。

是否可以使用 MapStruct 自动化,我将如何做到这一点?

澄清一下:我将手写的代码看起来像这样:

public MyEntity mapToEntity(final Map<String, String> parameters) {
  final MyEntity result = new MyEntity();
  result.setNote(parameters.get("note"));
  result.setDate(convertStringToDate(parameters.get("date")));
  result.setCustomer(mapIdToCustomer(parameters.get("customerId")));
  // ...
  return result;
}
4

2 回答 2

10

方法一

MapStruct 存储库为我们提供了有用的示例,例如Mapping from map

从 java.util.Map 映射 bean 看起来像:

@Mapper(uses = MappingUtil.class )
public interface SourceTargetMapper {

    SourceTargetMapper MAPPER = Mappers.getMapper( SourceTargetMapper.class );

    @Mappings({
        @Mapping(source = "map", target = "ip", qualifiedBy = Ip.class),
        @Mapping(source = "map", target = "server", qualifiedBy = Server.class),
    })
    Target toTarget(Source s);
}

注意使用 MappingUtil 类来帮助 MapStruct 弄清楚如何正确地从 Map 中提取值:

public class MappingUtil {

    @Qualifier
    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.SOURCE)
    public @interface Ip {
    }

    @Qualifier
    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.SOURCE)
    public static @interface Server {
    }

    @Ip
    public String ip(Map<String, Object> in) {
        return (String) in.get("ip");
    }

    @Server
    public String server(Map<String, Object> in) {
        return (String) in.get("server");
    }
}

方法二

根据 Raild 对与这篇文章相关的问题的评论,可以使用 MapStruct 表达式以更短的方式获得类似的结果:

@Mapping(expression = "java(parameters.get(\"name\"))", target = "name")
public MyEntity mapToEntity(final Map<String, String> parameters);

虽然没有关于性能的说明,但类型转换可能会更棘手,但对于简单的字符串到字符串的映射,它看起来确实更干净。

于 2018-01-08T15:12:27.170 回答
3

从版本1.5.0.Beta1 (2021 年 7 月)开始, MapStruct 支持从 Map 到 POJO 的映射

例子:

@Mapper
public interface CustomerMapper {
    @Mapping(target = "name", source = "customerName")
    Customer toCustomer(Map<String, String> map);
}
于 2021-10-21T06:03:27.203 回答