代码之家  ›  专栏  ›  技术社区  ›  Deepboy

mapstruct-无法将可选属性<localdate>映射到localdate

  •  1
  • Deepboy  · 技术社区  · 6 年前

    注意:这与StackOverflow上的其他问题不同,因为它们通过手动映射这两个类来解决这个问题。由于scheduleSource和scheduleTarget是完全相同的类,所以我希望自动映射它们。

    你好,

    我有两个类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)
    

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

    文件是:

    • 调度资源,调度表-两个爪哇bean
    • 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 回复  |  直到 6 年前
        1
  •  2
  •   Nestor Sokil    6 年前

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

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

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

    因此,它获取可选对象并尝试将其传递给接受localdate的方法。

    所以你可能的行动方式是

    1. 更改getter以返回简单对象
    2. 将setter改为接受可选的(我想可以,但是 好像有点不对劲)
    3. 声明映射器方法
        2
  •  0
  •   Steven Yang    6 年前

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