为了账号安全,请及时绑定邮箱和手机立即绑定

MapStruct - 无法将属性 Optional<LocalDate>

MapStruct - 无法将属性 Optional<LocalDate>

阿波罗的战车 2021-10-27 10:09:44
注意:这与 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 BeanScheduleMapper - 映射类。调度映射器package testStructMap;import org.mapstruct.*;import org.mapstruct.factory.*;@Mapperpublic 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;  }}
查看完整描述

3 回答

?
翻翻过去那场雪

TA贡献2065条经验 获得超13个赞

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

  }

}


查看完整回答
反对 回复 2021-10-27
?
杨魅力

TA贡献1811条经验 获得超6个赞

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


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


public Optional<LocalDate> getStartDate();

public void setStartDate(LocalDate startDate);

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


所以你可能的行动方式是


更改 getter 以返回一个简单的对象

更改 setter 以接受可选(我想这很好,但似乎有点偏离)

声明一个映射器方法


查看完整回答
反对 回复 2021-10-27
?
尚方宝剑之说

TA贡献1788条经验 获得超4个赞

将目标 Optional 映射到非 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" })

并且我们还需要添加用途和 Helper 类的名称


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


查看完整回答
反对 回复 2021-10-27
  • 3 回答
  • 0 关注
  • 180 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信