【问题标题】:MapStruct Spring Page to custom object conversion includes checkMapStruct Spring Page 到自定义对象的转换包括检查
【发布时间】:2022-08-20 17:40:43
【问题描述】:

我正在使用 MapStruct 将 Page 对象转换为我的应用程序的自定义对象。我正在使用此映射将 Page 对象的内容字段转换为在我的数据模型中找到的自定义对象列表:

@Mapping(target = \"journeys\", source = \"content\")

虽然这可以正常工作并且在内容存在时转换元素,但如果没有Page 内容,这将无法正常工作。看一下代码似乎表明在生成的映射器类中添加了以下检查:

if ( page.hasContent() ) {
    List<JourneyDateViewResponseDto> list = page.getContent();
    journeyDateViewPageResponseDto.setJourneys( new ArrayList<JourneyDateViewResponseDto>( list ) );
}

添加后,内部对象的映射操作被省略,这意味着我最终得到一个空列表。我不太确定为什么以及如何添加此检查,但我想找到一种禁用它的方法,并最终得到一个空的元素列表。有没有办法使用 MapStruct 来完成?

  • 为什么不调用Page.map 方法,该方法返回一个新页面,其内容由函数映射呢?
  • 当然,我有这个想法,但在我们的应用程序中有一种模式,我们使用 MapStruct 进行这些类型的操作。最重要的是,我想知道 mapstruct 为什么以及如何在内部添加此检查。请注意,我也在序列化默认的 Page 对象,但映射到自定义对象。

标签: spring spring-boot mapstruct


【解决方案1】:

MapStruct 具有存在检查器的概念(具有hasXXX 模式的方法)。这用于决定是否需要映射源属性。

如果你想在你的对象中有一个默认值,我建议确保你的对象是用一个空集合实例化的,或者为你要在其中设置空集合的对象提供一个@ObjectFactory

例如

类中的默认值

public class JourneyDateViewPageResponseDto {

    protected List<JourneyDateViewResponseDto> journeys = new ArrayList<>();

    //...

}

使用@ObjectFactory

@Mapper
public interface MyMapper {

    JourneyDateViewPageResponseDto map(Page< JourneyDateViewResponseDto> page);

    @ObjectFactory
    default JourneyDateViewPageResponseDto createDto() {
        JourneyDateViewPageResponseDto dto = new JourneyDateViewPageResponseDto();
        dto.setJourneys(new ArrayList<>());
        return dto;
    }
}

【讨论】:

  • 是否可以分享一个如何做到这一点的例子?
  • 我添加了一些示例
猜你喜欢
  • 1970-01-01
  • 2015-08-26
  • 1970-01-01
  • 1970-01-01
  • 2022-11-09
  • 1970-01-01
  • 2016-10-11
  • 1970-01-01
  • 2020-08-10
相关资源
最近更新 更多