首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Mapstruct -将属性映射到列表中对象的属性

Mapstruct -将属性映射到列表中对象的属性
EN

Stack Overflow用户
提问于 2022-06-08 16:08:24
回答 1查看 652关注 0票数 2

你好,我有以下课程:

代码语言:javascript
运行
复制
public class BookWriteModel {
    List<PageWriteModel> pages;
}

public class Book {
    List<Page> pages;
}

public class PageWriteModel {
    Long pageNumber;
}

public class Page {
    Long pageNumber;
    Long userId;
}

public class User {
    Long userId;
}

我现在的地图是这样的:

代码语言:javascript
运行
复制
@Mapper( componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE )
public interface BookMapper {
    Book map(BookWriteModel bookWriteModel, User user);
}

userId映射到页面上的userId的更简单的方法是什么?

谢谢

EN

回答 1

Stack Overflow用户

发布于 2022-06-09 00:30:10

解决方案1: @AfterMapping method

代码语言:javascript
运行
复制
@Mapper( componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE )
public interface BookMapper {
    BookMapper INSTANCE = Mappers.getMapper(BookMapper.class);

    Book map(BookWriteModel bookWriteModel, User user);

    @AfterMapping
    default void afterMap(@MappingTarget Book book, User user) {
        if (user != null) {
            for (Page page : book.pages) {
                page.userId = user.userId;
            }
        }
    }
}

生成的代码:

代码语言:javascript
运行
复制
@Component
public class BookMapperImpl implements BookMapper {
    @Override
    public Book map(BookWriteModel bookWriteModel, User user) {
        if ( bookWriteModel == null && user == null ) {
            return null;
        }
        Book book = new Book();
        if ( bookWriteModel != null ) {
            book.pages = pageWriteModelListToPageList( bookWriteModel.pages );
        }
        afterMap( book, user );
        return book;
    }

    protected Page pageWriteModelToPage(PageWriteModel pageWriteModel) {
        if ( pageWriteModel == null ) {
            return null;
        }
        Page page = new Page();
        page.pageNumber = pageWriteModel.pageNumber;
        return page;
    }

    protected List<Page> pageWriteModelListToPageList(List<PageWriteModel> list) {
        if ( list == null ) {
            return null;
        }
        List<Page> list1 = new ArrayList<Page>( list.size() );
        for ( PageWriteModel pageWriteModel : list ) {
            list1.add( pageWriteModelToPage( pageWriteModel ) );
        }
        return list1;
    }
}

解决方案2:使用 @上下文 来收集 @ObjectFactory

代码语言:javascript
运行
复制
@Mapper( componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE )
public interface BookMapper {
    BookMapper INSTANCE = Mappers.getMapper(BookMapper.class);

    Book map(BookWriteModel bookWriteModel, @Context User user);

    @ObjectFactory
    default Page create(@Context User user) {
        Page page = new Page();
        if (user != null) {
            page.userId = user.userId;
        }
        return page;
    }
}

生成的代码:

代码语言:javascript
运行
复制
@Component
public class BookMapperImpl implements BookMapper {
    @Override
    public Book map(BookWriteModel bookWriteModel, User user) {
        if ( bookWriteModel == null ) {
            return null;
        }
        Book book = new Book();
        book.pages = pageWriteModelListToPageList( bookWriteModel.pages, user );
        return book;
    }

    protected Page pageWriteModelToPage(PageWriteModel pageWriteModel, User user) {
        if ( pageWriteModel == null ) {
            return null;
        }
        Page page = create( user );
        page.pageNumber = pageWriteModel.pageNumber;
        return page;
    }

    protected List<Page> pageWriteModelListToPageList(List<PageWriteModel> list, User user) {
        if ( list == null ) {
            return null;
        }
        List<Page> list1 = new ArrayList<Page>( list.size() );
        for ( PageWriteModel pageWriteModel : list ) {
            list1.add( pageWriteModelToPage( pageWriteModel, user ) );
        }
        return list1;
    }
}

解决方案3:使用 @上下文 来收集 @ObjectFactory 和附加映射方法

代码语言:javascript
运行
复制
@Mapper( componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface BookMapper {
    BookMapper INSTANCE = Mappers.getMapper(BookMapper.class);

    Book map(BookWriteModel bookWriteModel, @Context User user);
    
    Page map(User user);

    @ObjectFactory
    default Page create(@Context User user) {
        Page page = map(user);
        return page == null ? new Page() : page;
    }
}

生成的代码:

代码语言:javascript
运行
复制
@Component
public class BookMapperImpl implements BookMapper {
    @Override
    public Book map(BookWriteModel bookWriteModel, User user) {
        if ( bookWriteModel == null ) {
            return null;
        }
        Book book = new Book();
        book.pages = pageWriteModelListToPageList( bookWriteModel.pages, user );
        return book;
    }

    @Override
    public Page map(User user) {
        if ( user == null ) {
            return null;
        }
        Page page = new Page();
        page.userId = user.userId;
        return page;
    }

    protected Page pageWriteModelToPage(PageWriteModel pageWriteModel, User user) {
        if ( pageWriteModel == null ) {
            return null;
        }
        Page page = create( user );
        page.pageNumber = pageWriteModel.pageNumber;
        return page;
    }

    protected List<Page> pageWriteModelListToPageList(List<PageWriteModel> list, User user) {
        if ( list == null ) {
            return null;
        }
        List<Page> list1 = new ArrayList<Page>( list.size() );
        for ( PageWriteModel pageWriteModel : list ) {
            list1.add( pageWriteModelToPage( pageWriteModel, user ) );
        }
        return list1;
    }
}

解决方案4: @上下文 方法作为映射方法的代理

代码语言:javascript
运行
复制
@Mapper( componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface BookMapper {
    BookMapper INSTANCE = Mappers.getMapper(BookMapper.class);

    Book map(BookWriteModel bookWriteModel, @Context User user);

    Page map(PageWriteModel pageWriteModel, User user);

    default Page mapContext(PageWriteModel pageWriteModel, @Context User user) {
        return map(pageWriteModel, user);
    }
}

生成的代码:

代码语言:javascript
运行
复制
@Component
public class BookMapperImpl implements BookMapper {

    @Override
    public Book map(BookWriteModel bookWriteModel, User user) {
        if ( bookWriteModel == null ) {
            return null;
        }

        Book book = new Book();

        book.pages = pageWriteModelListToPageList( bookWriteModel.pages, user );

        return book;
    }

    @Override
    public Page map(PageWriteModel pageWriteModel, User user) {
        if ( pageWriteModel == null && user == null ) {
            return null;
        }

        Page page = new Page();

        if ( pageWriteModel != null ) {
            page.pageNumber = pageWriteModel.pageNumber;
        }
        if ( user != null ) {
            page.userId = user.userId;
        }
        return page;
    }

    protected List<Page> pageWriteModelListToPageList(List<PageWriteModel> list, User user) {
        if ( list == null ) {
            return null;
        }
        List<Page> list1 = new ArrayList<Page>( list.size() );
        for ( PageWriteModel pageWriteModel : list ) {
            list1.add( mapContext( pageWriteModel, user ) );
        }
        return list1;
    }
}

我认为,解决方案4是明确和更好的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72548938

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档