MapStruct - Невозможно отобразить свойство Необязательно <LocalDate>в LocalDate - PullRequest
0 голосов
/ 03 октября 2018

ПРИМЕЧАНИЕ. Это не похоже на другие вопросы в StackOverflow, поскольку они решают эту проблему путем сопоставления двух классов вручную.Поскольку ScheduleSource и ScheduleTarget - это абсолютно одинаковые классы, я хочу, чтобы они отображались автоматически.

Привет,

У меня есть 2 класса ScheduleSource и ScheduleTarget.Они имеют точно такие же свойства.

Когда я пытаюсь использовать MapStruct для сопоставления ScheduleSource с ScheduleTarget, я получаю сообщение об ошибке:

  Can't map property "java.util.Optional<java.time.LocalDate> startDate" to "java.time.LocalDate startDate". Consider to declare/implement a mapping method: "java.time.LocalDate map(java.util.Optional<java.time.LocalDate> value)

Я прикрепил два файла.Не могли бы вы помочь?

Файлы:

  • ScheduleSource, ScheduleTarget - два Java Bean
  • ScheduleMapper - класс отображения.

  • ScheduleMapper.java

package testStructMap;

import org.mapstruct.*;
import org.mapstruct.factory.*;

@Mapper
public interface ScheduleMapper {
  ScheduleMapper INSTANCE = Mappers.getMapper( ScheduleMapper.class );

  ScheduleTarget scheduleSourceToScheduleTarget(ScheduleSource scheduleSource);
}
  • ScheduleSource.java, ScheduleTarget.Java - та же структура
package testStructMap;

import java.time.LocalDate;
import java.time.LocalTime;
import java.util.Optional;
import javax.validation.constraints.*;

public class ScheduleSource {
  @FutureOrPresent
  @NotNull
  private LocalDate startDate;
  @NotBlank
  private String repeatType;
  @Positive
  private Integer occurrences;

  public Optional<LocalDate> getStartDate() {
      return Optional.ofNullable(startDate);
  }
  public void setStartDate(LocalDate startDate) {
      this.startDate = startDate;
  }

  public String getRepeatType() {
      return repeatType;
  }
  public void setRepeatType(String repeatType) {
      this.repeatType = repeatType;
  }
  public Optional<Integer> getOccurrences() {
      return Optional.ofNullable(occurrences);
  }
  public void setOccurrences(Integer occurrences) {
      this.occurrences = occurrences;
  }
}

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

В 1.3.0.beta1 поддерживается следующее:

 package testStructMap;

import org.mapstruct.*;
import org.mapstruct.factory.*;

@Mapper
public interface ScheduleMapper {
  ScheduleMapper INSTANCE = Mappers.getMapper( ScheduleMapper.class );

  ScheduleTarget scheduleSourceToScheduleTarget(ScheduleSource scheduleSource);

  default <T> T unwrapOptional(Optional<T> optional) {
    return optional.orElse(null);
  }
}
0 голосов
/ 03 октября 2018

Я не знаком с mapstruct, но могу предположить, что он отображает разные объекты:)

Если ваш исходный и целевой классы имеют одинаковую структуру, то проблема в

public Optional<LocalDate> getStartDate();
public void setStartDate(LocalDate startDate);

Таким образом, он получает объект Optional и пытается передать его методу, принимающему LocalDate.

Итак, вы можете использовать следующие возможные действия:

  1. изменить геттер, чтобы вернуть простой объект
  2. изменить сеттер, чтобы принять необязательный (что хорошо, я думаю, но кажетсянемного выключен)
  3. объявить метод картографирования
...