你好,我有以下课程:
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;
}
我现在的地图是这样的:
@Mapper( componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE )
public interface BookMapper {
Book map(BookWriteModel bookWriteModel, User user);
}
将userId
映射到页面上的userId
的更简单的方法是什么?
谢谢
发布于 2022-06-09 00:30:10
解决方案1: @AfterMapping method
@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;
}
}
}
}
生成的代码:
@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
@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;
}
}
生成的代码:
@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 和附加映射方法
@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;
}
}
生成的代码:
@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: @上下文 方法作为映射方法的代理
@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);
}
}
生成的代码:
@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是明确和更好的。
https://stackoverflow.com/questions/72548938
复制相似问题