当前位置: 首页 > 知识库问答 >
问题:

MapStruct:将HashMap条目作为源处理

空鸿云
2023-03-14

这是我的源对象:

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);

}

目前它运行良好,但我想知道是否有一种更“优雅”的方法将地图条目设置为源。因为我没有使用“qualifiedByName”属性添加转换函数,所以看起来它只能在指定“源”时工作。我误解了什么吗?

我尝试了以下方法,但没有取得令人满意的结果:

>

  • 覆盖我的记录类中特定字段的getter
  • 添加一个具有“qualifiedByName”属性的转换函数。比如:

    @Named("metaGetter")
    default String dataGetter (String property) {
        return (String) r.meta.get(property);
    }
    

    但显然,这不会编译,因为属性名称作为正确的源无效。

    谢谢你的时间。

  • 共有1个答案

    左丘元徽
    2023-03-14

    写下你自己的限定词:

    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 );
    }
    
     类似资料:
    • 我想把它转换成数组,但是当我这样做的时候/我得到的是: 那么如何将转换为呢?在其他科目中找到的答案都不起作用。

    • 问题内容: 我有以下映射 我如何配置我的Mapper或Mappings,以便当childId为null时,将目标Entity.child设置为null而不是Entity.child.id? 问题答案: 对于我来说,找到的不是一个非常优雅的解决方案,而是可行的解决方案。 首先将接口更改为抽象类,然后添加

    • 所以我只使用Jooq来构建查询,而不是执行查询,如下所示: 对象可以执行查询conn.asyncExecute(org.jooq.query query)。所以我的问题是,如何创建类型为org.jooq的批插入查询。查询?具体来说,给定一个列表 请注意,我知道其他问题询问如何使用Jooq进行批处理插入,但他们使用Jooq执行查询就像下面Jose Martinez的回答一样,而这里我只使用Jooq构

    • 我正在从ModelMapper到MapStruct的转换过程中,到目前为止一切都很顺利,除了在列表上排序和筛选的情况,如果我有一个从域对象到实体的映射,例如: 从一个api中,我想在contactAddressLine1上进行过滤或排序,然后我想查找源代码(或反向映射时的目标代码),以便将其添加到动态jpq或sql查询中。 有没有办法用MapSTRt做到这一点? 使用ModelMapper,我可以

    • 问题内容: 我需要初始化一个常量HashMap,并希望在一行语句中完成它。避免这样的事情: 类似于目标C: 看了这么多,我还没有找到任何显示如何做到这一点的例子。 问题答案: 您可以使用 Double Brace初始化 ,如下所示: 作为警告,请参阅Java的效率效率“ Double BraceInitialization”,了解它可能带来的性能影响。

    • “想要解决方案B” 有什么办法可以做到这一点吗?