【问题标题】:Mapstruct : Map Object in List to ObjectMapstruct:将列表中的对象映射到对象
【发布时间】:2017-07-26 19:48:05
【问题描述】:

我正在尝试将实体对象映射到 DTO 以传输到前端应用程序。 查询返回包含机构名称和内部名称的列表,我想将它们映射到 DTO 中的模型机构和模型内部名称列表。 我被我的映射器类困住了。

以下是我的实体:

@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);

【问题讨论】:

标签: mapstruct


【解决方案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。但是,这会复杂得多。

【讨论】:

    猜你喜欢
    • 2019-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-18
    • 2016-03-11
    • 1970-01-01
    • 2020-10-12
    相关资源
    最近更新 更多