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);
}
}
:
답변 해 주셔서 감사합니다. 그래서 만약 'n'RequestFilter가 배열에 '기본'메소드를 필요로한다면? – ssdimmanuel
'n' RequestFilters가 있다면'@ AfterMapping'을 사용하여 소스와 타겟을 전달하고 거기에 매핑을 할 것을 제안합니다. 성능면에서 훨씬 더 좋을 것이고, 그것을 만들기 위해 한정자와 함께''@Mapping''을 정의 할 필요가 없습니다. – Filip