2017-09-06 5 views
1

ソースクラスのフィールド値をフィールドプロパティにマップする必要がある場所があります。私は@Mapper注釈の '式' パラメータを使用してMapstructを使用してそれを行うことができましたmapstruct - フィールド値をプロパティにマッピングする

Sourceクラス:

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

「式」を使用せずにマッピングを行う方法はありますか?ところで

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

答えて

1

あなたはあなたのためにそれをマップするカスタムメソッドを提供することができます。 sourcetargetが同じマップはMapStructが自動的に行うため、必要ありません。

+0

あなたの答えに感謝します。したがって、 'n'の '' default'メソッドが必要な配列に 'n' RequestFilterがある場合は? – ssdimmanuel

+0

'n' RequestFiltersを持っているなら、' @ AfterMapping'を使用してソースとターゲットを渡し、そこでマッピングを行うことをお勧めします。パフォーマンスがはるかに良いでしょうし、n '@ Mapping'を修飾子で定義して動作させる必要はありません – Filip

関連する問題