John
John

Reputation: 3

Converting single object inside list mapsturct

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

Answers (1)

Saheb
Saheb

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

Related Questions