代码之家  ›  专栏  ›  技术社区  ›  declan roche

使用mapstruct如何使用弹簧组件映射器将对象映射到对象列表

  •  0
  • declan roche  · 技术社区  · 7 年前

    我试图将一个对象A映射到对象B的列表。

    例如,我尝试了许多不同的方法 尝试使用“表达式”创建包含一个对象a的列表 和“qualifiedByName”,但这不起作用,因为我认为 当您使用表达式/限定名时,您不能使用

    我还尝试使用@aftermapper方法调用映射器 地图绘制者。获取目标映射器的句柄 未填充的位置。后映射中的映射使 我可以用源代码调用目标映射器 然后将目标添加到列表中。所以我希望 是从映射器中获取映射器组件句柄的另一种方法。

    我所有的地图绘制者都使用 @Mapper(componentModel="spring",

    欢迎所有建议

    当做

        // 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 回复  |  直到 7 年前
        1
  •  0
  •   Filip    7 年前

    问题是您正在尝试映射 Species List<Logdeclaration> 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:

    • Mappers#getMapper(Class) 当组件模型不是 default
    • 如果不想在表达式中使用FQN,可以使用 Mapper#imports MapStruct将在实现中导入它们。
    • 如果只有一个源参数,则不必在映射中使用它的名称

    例如

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

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