MapStruct - 无法将 属性 可选 <LocalDate> 映射到 LocalDate

MapStruct - Can't map property Optional<LocalDate> to LocalDate

注意:这与 Whosebug 上的其他问题不同,因为它们通过手动映射两个 classes 来解决此问题。由于 ScheduleSource 和 ScheduleTarget 完全一样 classes,我希望它们自动映射。

嗨,

我有 2 个 classes 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)

我已附上这两个文件。你能帮忙吗?

文件是:

package testStructMap;

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

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

  ScheduleTarget scheduleSourceToScheduleTarget(ScheduleSource scheduleSource);
}
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;
  }
}

我不熟悉 mapstruct,但我猜它映射了不同的对象:)

如果您的源和目标 类 具有相同的结构,那么问题是

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

因此它获取 Optional 对象并尝试将其传递给接受 LocalDate 的方法。

所以你可能的行动方式是

  1. 将getter更改为return一个简单的对象
  2. 更改 setter 以接受一个可选的(我想这很好,但是 似乎有点不对劲)
  3. 声明映射器方法

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

Map target Optional to source which is not Optional 我们怎样才能让它按照下面的例子:

@Named("HelperClass")
class Helper {
    @Named("convertToOptional")
    public Optional<KontaktpersonVerwandtschaftsgradTyp> convertToOptional(KontaktpersonVerwandtschaftsgradTyp optional) {
        return optional != null ?  Optional.of(optional) : Optional.empty();
    };
}

@Mapping(target = "kontaktpersonVerwandtschaftsgrad", source = "tdfFall.kontaktpersonVerwandtschaftsgrad", qualifiedByName = { "HelperClass",
            "convertToOptional" })

我们还需要添加助手的用途和名称class

@Mapper(componentModel = "spring", uses = { Helper.class })