我目前有一个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)
方法一
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)
虽然没有关于性能的说明,但这种方式类型转换可能更棘手,但对于简单的字符串到字符串映射,它看起来确实更清晰。
自版本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)
| 归档时间: |
|
| 查看次数: |
8879 次 |
| 最近记录: |