方法一
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);
虽然没有关于性能的说明,但类型转换可能会更棘手,但对于简单的字符串到字符串的映射,它看起来确实更干净。