MapStruct - 无法将属性 Optional<LocalDate>

注意:这与 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 - 映射类。


调度映射器


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;

  }

}


阿波罗的战车
浏览 181回答 3
3回答

翻翻过去那场雪

在 1.3.0.beta1 中支持以下内容:&nbsp;package testStructMap;import org.mapstruct.*;import org.mapstruct.factory.*;@Mapperpublic interface ScheduleMapper {&nbsp; ScheduleMapper INSTANCE = Mappers.getMapper( ScheduleMapper.class );&nbsp; ScheduleTarget scheduleSourceToScheduleTarget(ScheduleSource scheduleSource);&nbsp; default <T> T unwrapOptional(Optional<T> optional) {&nbsp; &nbsp; return optional.orElse(null);&nbsp; }}

杨魅力

我不熟悉 mapstruct,但我猜它映射了不同的对象:)如果您的源类和目标类具有相同的结构,那么问题是public Optional<LocalDate> getStartDate();public void setStartDate(LocalDate startDate);因此它获取 Optional 对象并尝试将其传递给接受 LocalDate 的方法。所以你可能的行动方式是更改 getter 以返回一个简单的对象更改 setter 以接受可选(我想这很好,但似乎有点偏离)声明一个映射器方法

尚方宝剑之说

将目标 Optional 映射到非 Optional 的源,我们如何使其遵循以下示例:@Named("HelperClass")class Helper {&nbsp; &nbsp; @Named("convertToOptional")&nbsp; &nbsp; public Optional<KontaktpersonVerwandtschaftsgradTyp> convertToOptional(KontaktpersonVerwandtschaftsgradTyp optional) {&nbsp; &nbsp; &nbsp; &nbsp; return optional != null ?&nbsp; Optional.of(optional) : Optional.empty();&nbsp; &nbsp; };}@Mapping(target = "kontaktpersonVerwandtschaftsgrad", source = "tdfFall.kontaktpersonVerwandtschaftsgrad", qualifiedByName = { "HelperClass",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "convertToOptional" })并且我们还需要添加用途和 Helper 类的名称@Mapper(componentModel = "spring", uses = { Helper.class })
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java