2017-07-26 4 views
0

フロントエンドアプリケーションに転送するためにEntityオブジェクトをDTOにマップしようとしています。 クエリはinstitutionNameとinternalNameを含むリストを返します。これらをDTOのmodelsInstitutionとmodelsInternalNameのListにマップします。 私は私のマッパーのクラスで立ち往生しています。Mapstruct:リストオブジェクトへのマップオブジェクト

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; 
    } 
} 

マッパーのクラス:以下

@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オブジェクトである:以下

は私のエンティティである

私のマッピングが正しくありません、私は中にエンティティをマッピングする方法を行方不明です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); 
    } 
} 

@Context@AfterMapping@BeforeMapping@ObjectFactoryを使用することにより、MapStructでこれを行う方法があるかもしれません。しかし、これははるかに複雑になるでしょう。