Преобразование одного объекта внутри списка mapsturct - PullRequest
0 голосов
/ 10 июля 2020

Как мне сделать 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<>();
}

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

My TaskList Mapper ниже;

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

поэтому, когда я пытаюсь запустить Я получил сообщение «Результат несопоставленного целевого свойства»

Спасибо

1 Ответ

1 голос
/ 10 июля 2020

Это происходит потому, что метод, предоставленный для сопоставления поля 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, сначала реализует сопоставление между TaskList и TaskResponse, а затем, в свою очередь, List<TaskList> с List<TaskResponse>

...