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

如何使用mapstruct将对象映射到带有spring组件映射器的对象列表

林丁雷
2023-03-14

我试图将对象A映射到对象B的列表。我有一个映射器,它从对象A映射到对象B。

欢迎所有建议。下面是显示问题的代码示例。

你好,德克兰

    // SPECIESTOLOGSPECY.JAVA
    // From this mapper I want to call SpecyToLogDeclarationMapperApi mapper
    // to map ‘species’ to ‘logdeclarations’ which is a list of logdeclaration
    // you can see want I am trying to do in the aftermapping method
    // where I map species to logdeclaration and then put this into a list
    // unfortunately I need other mapping components (ConfigMapperFromCode & SpecyToFishDeclarationMapperApi)
    // to be autowired into  SpecyToLogDeclarationMapperApi and this is not happening.
    // is there another way to get a handle to the spring managed 
    // SpecyToLogDeclarationMapperApi mapper ?

     @Mapper(componentModel="spring",
     uses = {
         ConfigMapperFromCode.class, 
         GeoInfoMapper.class,
         SpecyToLogDeclarationMapperApi.class
            })
     public interface SpeciesToLogSpecy {
     SpecyToLogDeclarationMapperApi MAPPER = Mappers.getMapper(SpecyToLogDeclarationMapperApi.class);

@Mappings(
        {
            @Mapping(target="createdate", expression = "java(java.sql.Timestamp.valueOf(java.time.LocalDateTime.now()))"),
            @Mapping(target="speciesid", qualifiedByName={"ConfigMapperFromCode", "speciesIdFromCodeAsDecimal"},  source = "species.speciesCode"),
            @Mapping(target="unitweight", constant = "1"),
            @Mapping(target = "inactiveind", constant = "N"),
            @Mapping(target = "unitdefaultind", constant = "Y"),
            @Mapping(target = "sectiontypeid", expression = "java(new BigDecimal(ie.gov.agriculture.fisheries.logsheet.mapping.constants.MappingConstants.LOG_SPECIES_SECTION_TYPE_SHEETDECLARATION))"),
            @Mapping(target = "unituomid", expression = "java(new BigDecimal(ie.gov.agriculture.fisheries.logsheet.mapping.constants.MappingConstants.LOGSHEET_CATCHUNITS_KG))"),
            @Mapping(target="catchtypeid",  qualifiedByName={"ConfigMapperFromCode", "returnCatchTypeId"},  source = "species.spType"),
            @Mapping(target="legalfishsizetypeid",  qualifiedByName={"ConfigMapperFromCode", "legalFishSizeTypeIdFromCode"},  source = "species.fishSizeClass"),
            @Mapping(target="presenttypeid",  qualifiedByName={"ConfigMapperFromCode", "presentationTypeIdFromCode"},  source = "species.presentation.presentationType"),
            //@Mapping(target="logdeclarations", source = "species")                
        }           
         )
Logspecy speciesToLogspecy(Species species, @Context ExtraFields extraFields);


    @AfterMapping
    default void afterMap(@MappingTarget Logspecy logspecy, @Context ExtraFields extraFields){
    Logdeclaration logDeclaration = MAPPER.SpeciesToLogDeclarations(species, extraFields);

    List<Logdeclaration> logdeclarations = new ArrayList<Logdeclaration>(); 
    logdeclarations.add(logDeclaration);
    logSpecy.setLogdeclarations(logdeclarations);    
    {




    // SPECYTOLOGDECLARATIONMAPPERAPI.JAVA



    @Mapper(componentModel="spring",
    uses = {
        ConfigMapperFromCode.class,
        SpecyToFishDeclarationMapperApi.class       
        }    
)
public interface SpecyToLogDeclarationMapperApi {


@Mappings(
        {
            @Mapping(target="createdate", expression = "java(java.sql.Timestamp.valueOf(java.time.LocalDateTime.now()))"),              
            @Mapping(target="geartypeid", qualifiedByName={"ConfigMapperFromCode", "gearIdFromCode"},  source = "species.gearType"),
            @Mapping(target="fishcount", source = "species.qty"),
            @Mapping(target = "inactiveind", constant = "N"),
            @Mapping(target="packagetypeid", qualifiedByName={"ConfigMapperFromCode", "packagingTypeIdFromCode"},  source = "species.presentation.packaging"),
            @Mapping(target="packagecount", source = "species.presentation.pkgunit"),
            @Mapping(target="avgpackageweight", source = "species.presentation.pkgUnitWeight"),
            @Mapping(target="conversionfactor", source = "species.presentation.convFactor"),
            @Mapping(target="fishdeclaration", source = "species.geoInfo")              
        }           
        )
Logdeclaration SpeciesToLogDeclarations (Species species, @Context ExtraFields extraFields);    

共有1个答案

邵伟泽
2023-03-14

问题是,您试图将物种映射到列表 ,而MapStruct找不到这样的映射方法。为了使其工作,您可以将以下方法添加到specytologdeclarationmapperapi:

default List<Logdeclaration> SpeciesToLogDeclarationsToList(Species species, @Context ExtraFields extraFields) {
    if ( species == null ) {
        return null;
    }

    Logdeclaration logDeclaration = SpeciesToLogDeclarations(species, extraFields);

    List<Logdeclaration> logdeclarations = new ArrayList<Logdeclaration>();
    logdeclarations.add(logDeclaration);
    return logdeclarations;
}

这是一些其他的事情,我认为您可以改进代码并“更正确地”使用MapStruct:

  • 当组件模型不是默认值
  • 时,需要删除 映射器#getmapper(Class)的用法
  • 如果您不想在表达式中使用FQN,可以使用mapper#imports,MapStruct将在实现中导入它们。
  • 当只有一个源参数时,不必在映射中使用它的名称

例如。

@Mapping(target="fishcount", source = "species.qty")

可以是

@Mapping(target="fishcount", source = "qty")
 类似资料: