2017-09-06 2 views
1

소스 클래스의 필드 값을 필드 속성에 매핑하려는 요구 사항이 있습니다. 나는 @Mapper 주석의 '표현'매개 변수를 사용하여 Mapstruct를 사용하여 할 수 있었다mapstruct - 필드 값을 속성에 매핑

소스 클래스 :

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

"표현식"을 사용하지 않고 매핑을 수행하는 다른 방법이 있습니까? Btw은

@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

당신은 당신을 위해 그것을지도 할 사용자 정의 방법을 제공 할 수 있습니다. MapStruct가 자동으로 수행하므로 sourcetarget이 같은 매핑은 필요하지 않습니다.

+0

답변 해 주셔서 감사합니다. 그래서 만약 'n'RequestFilter가 배열에 '기본'메소드를 필요로한다면? – ssdimmanuel

+0

'n' RequestFilters가 있다면'@ AfterMapping'을 사용하여 소스와 타겟을 전달하고 거기에 매핑을 할 것을 제안합니다. 성능면에서 훨씬 더 좋을 것이고, 그것을 만들기 위해 한정자와 함께''@Mapping''을 정의 할 필요가 없습니다. – Filip