首页 > 解决方案 > 转换列表映射结构内的单个对象

问题描述

如何为以下场景进行响应映射 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<>();
}

我的枚举任务如下;

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

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

谢谢

标签: javajsonspringspring-bootmapstruct

解决方案


发生这种情况是因为为映射taskStatus字段提供的方法具有返回类型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,会先实现to之间的映射TaskListTaskResponse然后依次List<TaskList>toList<TaskResponse>


推荐阅读