MapStruct:从 java.util.Map 映射到 Bean?

Two*_*The 8 java mapstruct

我目前有一个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;
}
Run Code Online (Sandbox Code Playgroud)

m4r*_*tin 9

方法一

MapStruct 存储库为我们提供了有用的示例,例如从 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);
}
Run Code Online (Sandbox Code Playgroud)

请注意 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");
    }
}
Run Code Online (Sandbox Code Playgroud)

方法二

根据 Raild 对与本文相关问题的评论,可以使用 MapStruct 表达式以更短的方式实现类似的结果:

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

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


xar*_*aiz 8

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

例子:

@Mapper
public interface CustomerMapper {
    @Mapping(target = "name", source = "customerName")
    Customer toCustomer(Map<String, String> map);
}
Run Code Online (Sandbox Code Playgroud)