2017-09-06 137 views
1

我有要求將源類中的字段值映射到字段屬性的位置。我能夠使用Mapstruct使用@Mapper註釋的 '表達' 參數做MAPtruct - 將字段值映射到屬性

源類:

public class ClassA { 

    public ClassA() { 
    } 

    private String name; 
    private String address; 

    private ArrayList<RequestFilter> filter; 

    public ArrayList<RequestFilter> getFilter() { 
     return filter; 
    } 

    public void setFilter(ArrayList<RequestFilter> filter) { 
     this.filter = filter; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getAddress() { 
     return address; 
    } 

    public void setAddress(String address) { 
     this.address = address; 
    } 

} 

目標類:

public class ClassATransform { 

    public ClassATransform() { 
    } 

    private String name; 
    private String id; 
    private String address; 
    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
    public String getAddress() { 
     return address; 
    } 
    public void setAddress(String address) { 
     this.address = address; 
    } 
    public String getId() { 
     return id; 
    } 
    public void setId(String id) { 
     this.id = id; 
    } 
} 

我mapstruct映射器看起來是這樣的:

@Mapper(imports=RequestFilter.class) 
public interface ClassAMapper { 

    ClassAMapper INSTANCE = Mappers.getMapper(ClassAMapper.class); 

    @Mappings({ 
     @Mapping(target = "name", source = "name"), 
     @Mapping(target= "address", source = "address"), 
     @Mapping(target = "id", expression="java(req.getFilter().get(req.getFilter().indexOf(new RequestFilter(\"id\"))).filterValue)") 
    }) 
    ClassATransform classAToDTO(ClassA req); 
} 

RequestFilter.java:

public class RequestFilter { 

public RequestFilter() { 
} 


public RequestFilter(String filterName) { 
    this.filterName = filterName; 
} 


public String filterName; 
public String filterValue; 
public String filterOperator; 
public String joinOperator; 
@Override 
public int hashCode() { 
    final int prime = 31; 
    int result = 1; 
    result = prime * result + ((filterName == null) ? 0 : filterName.hashCode()); 
    return result; 
} 
@Override 
public boolean equals(Object obj) { 
    if (this == obj) 
     return true; 
    if (obj == null) 
     return false; 
    if (getClass() != obj.getClass()) 
     return false; 
    RequestFilter other = (RequestFilter) obj; 
    if (filterName == null) { 
     if (other.filterName != null) 
      return false; 
    } else if (!filterName.equals(other.filterName)) 
     return false; 
    return true; 
    } 
} 

有沒有其他方法可以在不使用「表達式」的情況下進行映射?

回答

1

你可以提供一個自定義的方法,將其映射爲您:

@Mapper 
public interface ClassAMapper { 

    ClassAMapper INSTANCE = Mappers.getMapper(ClassAMapper.class); 

    @Mappings({ 
     @Mapping(target = "id", source = "req") 
    }) 
    ClassATransform classAToDTO(ClassA req); 

    default String mapToid(ClassA req) { 
     // null checks 
     return reg.getFilter() 
        .stream() 
        .filter(filter -> filter.filterName.equals("id")) 
        .findAny() 
        .orElse(null); 
    } 
} 

順便說一句。 和target相同的映射不需要,因爲MapStruct會自動執行該操作。

+0

感謝您的回答。那麼如果在數組中有'n'RequestFilter,我需要'n''default'方法嗎? – ssdimmanuel

+0

如果你有'n'RequestFilters,我建議你使用'@ AfterMapping',你可以在那裏傳入源和目標並在那裏做映射。這對性能會更好,並且您不需要使用限定符來定義n'@ Mapping'就可以使其工作 – Filip

相關問題