这是我的源对象:
public class Record {
public final long captureTime;
public final String environnement;
public final String bundle;
public final String type;
public final String id;
public final Map<String,Object> meta;
}
这是我的目标对象:
public class MappedRecord {
public final long captureTime;
public final String environnement;
public final String bundle;
public final String type;
public final String id;
public final String ip;
public final String server;
}
我的映射器如下所示:
public interface RecordMapper {
RecordMapper MAPPER = Mappers.getMapper( RecordMapper.class );
@Mappings({
@Mapping(source = "captureTime", target = "captureTime"),
@Mapping(source = "environnement", target = "environnement"),
@Mapping(source = "bundle", target = "bundle"),
@Mapping(source = "type", target = "type"),
@Mapping(source = "id", target = "id"),
@Mapping(expression = "java((String) r.meta.get(\"ip\"))", target = "ip"),
@Mapping(expression = "java((String) r.meta.get(\"server\"))", target = "server"),
})
MappedRecord toMappedRecord(Record r);
}
目前它运作良好,但我想知道是否有更“优雅”的方式将Map条目设置为源。因为有了这个,我没有设法使用“qualifiedByName”属性添加转换函数,看起来它只能在指定“source”时才能工作。我误解了什么吗?
我尝试了以下方法而没有令人满意的结果:
使用“qualifiedByName”属性添加转换函数。类似的东西:
@Named("metaGetter")
default String dataGetter (String property) {
return (String) r.meta.get(property);
}
但显然这不会编译,因为属性名称无效作为正确的来源。
感谢您的时间。
答案 0 :(得分:6)
编写自己的限定符:
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");
}
}
然后只需添加到映射:
@Mapper( uses = MappingUtil.class )
public interface SourceTargetMapper {
SourceTargetMapper MAPPER = Mappers.getMapper( SourceTargetMapper.class );
@Mappings( {
@Mapping(source = "map", target = "ip", qualifiedBy = MappingUtil.Ip.class ),
@Mapping(source = "map", target = "server", qualifiedBy = MappingUtil.Server.class ),
} )
Target toTarget( Source s );
}