Mapstruct 1.3.0.Final版本为可选的集合getter字段生成错误的代码生成

时间:2020-10-12 08:00:40

标签: java lombok mapstruct

我们有一个带有可选getter字段的POJO类。 mapstruct 1.3.0.Final为Optional集合字段生成了错误的代码。

我们有ProgramAggregate POJO,它包含程序的集合(Collection),它是一个可选的getter类型。

当我们使用mapstruct 1.2.0.Final运行时,我们看到了正确的代码生成。 但是与1.3.0.Final相同的代码会生成错误的代码。它不会为Optional Collection getter方法生成Collection映射方法。 Generated code image

@Data
@NoArgsConstructor
@ToString(callSuper = true)
@FieldDefaults(makeFinal = false, level = AccessLevel.PRIVATE)
public class ProgramAggregate {
    public static final long serialVersionUID = 1L;

    Collection<Program> programs;

    public Optional<Collection<Program>> getPrograms() {
        return Optional.ofNullable(programs);
    }


}


@Data
@NoArgsConstructor
@FieldDefaults(makeFinal = false, level = AccessLevel.PRIVATE)
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "_type")
public class Program {
    String name;
    String number;


    public Optional<String> getName() {
        return Optional.ofNullable(name);
    }

    public Optional<String> getNumber() {
        return Optional.ofNullable(number);
    }

}


@Data
@NoArgsConstructor
@FieldDefaults(makeFinal = false, level = AccessLevel.PRIVATE)
public class ProgramResponseDto {
    Collection<ProgramDto> programs;

    public Optional<Collection<ProgramDto>> getPrograms() {
        return Optional.ofNullable(programs);
    }

}

@Data
@NoArgsConstructor
@FieldDefaults(makeFinal = false, level = AccessLevel.PRIVATE)
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "_type")
public class ProgramDto {
    String name;
    String number;
    String oldNumber;

    public Optional<String> getName() {
        return Optional.ofNullable(name);
    }

    public Optional<String> getNumber() {
        return Optional.ofNullable(number);
    }

    public Optional<String> getOldNumber() {
        return Optional.ofNullable(oldNumber);
    }

}

@Mapper(nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS, unmappedTargetPolicy = ReportingPolicy.WARN,
        collectionMappingStrategy = CollectionMappingStrategy.TARGET_IMMUTABLE)
public interface IProgramMapper extends IOptionalMapper, IDefaultMapper {
    ProgramResponseDto map(ProgramAggregate programAggregate);

    ProgramDto map(Program sourceProgramDto);

    Collection<ProgramDto> mapPrograms(Collection<Program> sourcePrograms);



}

结果:

@Generated(
    value = "org.mapstruct.ap.MappingProcessor",
    date = "2020-10-12T13:10:32+0530",
    comments = "version: 1.3.0.Final, compiler: javac, environment: Java 1.8.0_231 (Oracle Corporation)"
)
public class IProgramMapperImpl implements IProgramMapper {

    @Override
    public ProgramResponseDto map(ProgramAggregate programAggregate) {
        if ( programAggregate == null ) {
            return null;
        }

        ProgramResponseDto programResponseDto = new ProgramResponseDto();

        **Collection<ProgramDto> collection = fromOptional( programAggregate.getPrograms() );**
        if ( collection != null ) {
            programResponseDto.setPrograms( collection );
        }

        return programResponseDto;
    }

    @Override
    public ProgramDto map(Program sourceProgramDto) {
        if ( sourceProgramDto == null ) {
            return null;
        }

        ProgramDto programDto = new ProgramDto();

        if ( sourceProgramDto.getName() != null ) {
            programDto.setName( fromOptional( sourceProgramDto.getName() ) );
        }
        if ( sourceProgramDto.getNumber() != null ) {
            programDto.setNumber( fromOptional( sourceProgramDto.getNumber() ) );
        }

        return programDto;
    }

    @Override
    public Collection<ProgramDto> mapPrograms(Collection<Program> sourcePrograms) {
        if ( sourcePrograms == null ) {
            return null;
        }

        Collection<ProgramDto> collection = new ArrayList<ProgramDto>( sourcePrograms.size() );
        for ( Program program : sourcePrograms ) {
            collection.add( map( program ) );
        }

        return collection;
    }
}

以下是构建Maven后的错误。 错误:

[错误] //mapstruct_latest_example/target/generated-sources/annotations/IProgramMapperImpl.java:[21,57]不兼容的类型:推断变量T具有不兼容的边界 [错误]相等约束:java.util.Collection [错误]上限:java.util.Collection,java.lang.Object

1 个答案:

答案 0 :(得分:0)

问题: 匹配时允许类型中的泛型

例如方法签名,例如

<T> T fromOptional(Optional<T> optional)

当T解析为另一个通用类(例如Collection)

此问题可能会在 mapstruct 1.4.2 版本中解决。

相关问题