2017-07-26 450 views
0

我试图将Entity对象映射到DTO以转移到前端应用程序。 查询返回包含institutionName和internalName的列表,我想将它们映射到DTO中的ModelsInstitution和modelsInternalName列表。 我被我的mappers类困住了。构造:将List中的对象映射到对象

下面是我的实体:

@Entity 
@DynamoDBTable(tableName = "Inventory") 
public class Inventory 
{ 
    @Id 
    private String id; 
    private String institutionName; 
    private String internalName; 
    private String lanAdapter; 

    public Inventory() { 
    } 

    public Inventory(String Id,String InstitutionName, String LanAdapter, String InternalName) 
    { 
     this.id = Id 
     this.lanAdapter = LanAdapter; 
     this.institutionName = InstitutionName; 
     this.internalName = InternalName; 

    } 

    @DynamoDBHashKey(attributeName = "Id") 
    public String getId() 
    { 
     return id; 
    } 
    public void setId(String id) 
    { 
     this.id=id; 
    } 

    @DynamoDBAttribute(attributeName = "InstitutionName") 
    public String getInstitutionName() 
    { 
     return institutionName; 
    } 
    public void setInstitutionName(String InstitutionName) 
    { 
     this.institutionName = InstitutionName; 
    } 

    @DynamoDBAttribute(attributeName = "LanAdapter") 
    public String getLanAdapter() 
    { 
     return lanAdapter; 
    } 
    public void setLanAdapter(String LanAdapter) 
    { 
     this.lanAdapter = LanAdapter; 
    } 

     @DynamoDBAttribute(attributeName = "InternalName") 
    public String getInternalName() 
    { 
     return internalName; 
    } 
    public void setInternalName(String InternalName) 
    { 
     this.internalName = InternalName; 
    } 
} 

下面是我的DTO对象:

public class FilterDto 
{ 
    private List<String> modelsInstitution; 
    private List<String> modelsInternalName; 

    public FilterDto(List<String> modelsInstitution, List<String> versions) { 
     super(); 
     this.modelsInstitution = modelsInstitution; 
     this.modelsInternalName = modelsInternalName; 
    } 

    public List<String> getModelInstitution() { 
     return modelsInstitution; 
    } 
    public void setModelInstitution(List<String> modelsInstitution) { 
     this.modelsInstitution = modelsInstitution; 
    } 
    public List<String> getModelInternalName() { 
     return modelsInternalName; 
    } 
    public void setModelInternalName(List<String> modelsInternalName) { 
     this.modelsInternalName = modelsInternalName; 
    } 
} 

映射类:

我的映射是不正确的,我错过了如何在地图实体列入DTO。

@IterableMapping(elementTargetType = Inventory.class) 
@Mappings({ 
    @Mapping(target="modelsInstitution", expression="java(inventory.getInstitution())"), 
    @Mapping(target="modelsInternalName", expression="java(inventory.getInternalName())") 
}) 
FilterDto InventoryToFilterDTO1(List<Inventory> inventory); 
+0

你一定要看看lombok:https://projectlombok.org/ – Krzysiek

回答

1

你不能用MapStruct干净地做到这一点。我建议你手动做这个映射。

你的映射可以是这样的:

public interface MyMapper { 

    default FilterDto InventoryToFilterDTO1(List<Inventory> inventory) { 
     List<String> institutions = new ArrayList<>(inventory.size()); 
     List<String> names = new ArrayList<>(inventory.size()); 

     for(Inventory inv: inventory) { 
      institutions.add(inv.getInstitution()); 
      names.add(inv.getInternalName())); 
     } 

     return new FilterDto(institutions, names); 
    } 
} 

从理论上说,有可能是一种方式与MapStruct做到这一点,利用@Context@AfterMapping@BeforeMapping@ObjectFactory。但是,这将更加复杂。