在列表 mapstruct 中转换单个对象

Converting single object inside list mapsturct

如何为以下场景做响应映射 MapStruct

下面是我的模型;

@Getter
@Setter
public class TaskList {

   private Long taskStatus;
}

我的回复如下;

@Getter
@Setter
public class TaskResponse {

 private Long taskStatus;
}

我正在将响应 pojo 包装到下面的响应列表中;

public class AllTaskListResponse {
  
   private List<TaskResponse> taskResponseList = new ArrayList<>();
}

下面是我的 enumTask;

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

下面是我的任务列表映射器;

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

所以当我尝试 运行 时,我收到了“未映射的目标 属性 结果”消息

谢谢

这是因为为 taskStatus 字段提供的映射方法具有 return 类型的 TaskStatusEnum,但是,taskStatus 字段是 Long来源和目标。

要么,像这样将目标字段类型转换为枚举:

@Getter
@Setter
public class TaskResponse {
    private TaskStatusEnum taskStatus;
}

或者,删除 taskStatus 字段的映射:

public abstract List<TaskResponse> toAllTaskListResponse(List<TaskList> taskList);

此外,列表转换方法需要另一种将单个 TaskList 转换为 TaskResponse 的方法。如果需要,应该在那里应用 taskStatus 的映射。像这样:

@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,会先实现TaskListTaskResponse的映射,然后依次实现List<TaskList>List<TaskResponse>

的映射