Reputation: 3
How can I do Response Mapping MapStruct for the below scenario
My model is below;
@Getter
@Setter
public class TaskList {
private Long taskStatus;
}
My Response is below;
@Getter
@Setter
public class TaskResponse {
private Long taskStatus;
}
I am wrapping Response pojo to Response List below;
public class AllTaskListResponse {
private List<TaskResponse> taskResponseList = new ArrayList<>();
}
My enumTask below;
public enum TaskStatusEnum {
Sth(1);
Sth(2);
private final long value;
TaskStatusEnum(long value) {
this.value = value;
}
public static TaskStatusEnum get(long value) {
for (TaskStatusEnum status : TaskStatusEnum.values()) {
if(status.value == value) {
return status;
}
}
return null;
}
}
My TaskList Mapper below;
@Named("taskStatusToString")
public static TaskStatusEnum taskStatusToString(long taskStatus) {
return TasStatusEnum.get(taskStatus);
}
@Mapping(source = "taskStatus", target = "taskStatus", qualifiedByName = "taskStatusToString")
public abstract List<TaskResponse> toAllTaskListResponse(List<TaskList> taskList);
so When I try to run I got "Unmapped target property result" message I received
Thank you
Upvotes: 0
Views: 208
Reputation: 1492
It is happening because the method provided for mapping taskStatus
field has a return type of TaskStatusEnum
, however, taskStatus
field is Long
in both source and target.
Either, convert the target field type to enum like this:
@Getter
@Setter
public class TaskResponse {
private TaskStatusEnum taskStatus;
}
Or, remove the mapping for taskStatus
field:
public abstract List<TaskResponse> toAllTaskListResponse(List<TaskList> taskList);
Also, another method for converting single TaskList
to TaskResponse
would be required for the list converting methods to work. The mapping for taskStatus
should be applied there, if required. Something like this:
@Mapping(source= "taskStatus", target = "taskStatus", qualifiedByName= "taskStatusToString")
public abstract TaskResponse toTaskResponse(TaskList taskList);
public abstract List<TaskResponse> toAllTaskListResponse(List<TaskList> taskList);
@Named("taskStatusToString")
public static TaskStatusEnum taskStatusToString(long taskStatus) {
return TasStatusEnum.get(taskStatus);
}
Mapstruct, will first implement the mapping between TaskList
to TaskResponse
and then in turn List<TaskList>
to List<TaskResponse>
Upvotes: 1