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

Java Mapstruct 1.3.0.Final版本为可选集合getter字段生成错误的代码,java,lombok,mapstruct,Java,Lombok,Mapstruct,我们有一个带有可选getter字段的POJO类。mapstruct 1.3.0.Final为可选集合字段生成错误代码 我们有一个包含程序集合(Collection)的ProgramAggregate POJO,它是可选的getter类型 当我们使用mapstruct 1.2.0.Final运行时,我们看到了正确的代码生成。 但与1.3.0.0相同的代码最终生成错误的代码。它没有为可选的集合getter方法生成集合映射方法。 @数据 @诺尔格构装师 @ToString(callSuper=tru

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

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

当我们使用mapstruct 1.2.0.Final运行时,我们看到了正确的代码生成。 但与1.3.0.0相同的代码最终生成错误的代码。它没有为可选的集合getter方法生成集合映射方法。

@数据
@诺尔格构装师
@ToString(callSuper=true)
@字段默认值(makeFinal=false,level=AccessLevel.PRIVATE)
公共类程序集{
公共静态最终长serialVersionUID=1L;
收集方案;
公共可选getPrograms(){
返回可选。不可用(程序);
}
}
@资料
@诺尔格构装师
@字段默认值(makeFinal=false,level=AccessLevel.PRIVATE)
@JsonTypeInfo(use=JsonTypeInfo.Id.NAME,property=“\u type”)
公共课程{
字符串名;
字符串编号;
公共可选getName(){
返回可选。不可用(名称);
}
公共可选getNumber(){
返回可选。未满(数字);
}
}
@资料
@诺尔格构装师
@字段默认值(makeFinal=false,level=AccessLevel.PRIVATE)
公共课计划{
收集方案;
公共可选getPrograms(){
返回可选。不可用(程序);
}
}
@资料
@诺尔格构装师
@字段默认值(makeFinal=false,level=AccessLevel.PRIVATE)
@JsonTypeInfo(use=JsonTypeInfo.Id.NAME,property=“\u type”)
公共课计划{
字符串名;
字符串编号;
字符串编号;
公共可选getName(){
返回可选。不可用(名称);
}
公共可选getNumber(){
返回可选。未满(数字);
}
公共可选getOldNumber(){
返回可选的可空值(oldNumber);
}
}
@映射器(nullValueCheckStrategy=nullValueCheckStrategy.ALWAYS,UnappedTargetPolicy=ReportingPolicy.WARN,
collectionMappingStrategy=collectionMappingStrategy.TARGET\u不可变)
公共接口IProgramMapper扩展IOPerationalMapper、IDefaultMapper{
ProgramResponseDto映射(ProgramAggregate ProgramAggregate);
ProgramDto映射(Program sourceProgramDto);
集合映射程序(集合源程序);
}
结果:

@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;
    }
}
@已生成(
value=“org.mapstruct.ap.MappingProcessor”,
日期=“2020-10-12T13:10:32+0530”,
comments=“version:1.3.0.Final,编译器:javac,环境:java1.8.0_231(Oracle公司)”
)
公共类IProgramApperImpl实现IProgramApper{
@凌驾
公共程序响应映射(程序聚合程序聚合){
如果(programAggregate==null){
返回null;
}
ProgramResponseDto ProgramResponseDto=新的ProgramResponseDto();
**Collection Collection=fromOptional(programAggregate.getPrograms())**
if(集合!=null){
programResponseDto.setPrograms(集合);
}
返回程序响应到;
}
@凌驾
公共程序到映射(程序源程序到){
if(sourceProgramDto==null){
返回null;
}
ProgramDto ProgramDto=新的ProgramDto();
if(sourceProgramDto.getName()!=null){
programDto.setName(fromOptional(sourceProgramDto.getName());
}
if(sourceProgramDto.getNumber()!=null){
programDto.setNumber(从可选(sourceProgramDto.getNumber());
}
返回编程到;
}
@凌驾
公共集合映射程序(集合源程序){
if(sourcePrograms==null){
返回null;
}
Collection=newarraylist(sourcePrograms.size());
for(程序:sourcePrograms){
集合。添加(映射(程序));
}
回收;
}
}
下面是maven构建后的错误。 错误:

[ERROR]//mapstruct\u latest\u示例/target/generated sources/annotations/IProgramMapperImpl.java:[21,57]不兼容类型:推理变量T的边界不兼容 [错误]相等约束:java.util.Collection [错误]上限:java.util.Collection,java.lang.Object 匹配时允许类型中泛型的泛型

e、 g.方法签名,例如

<T> T fromOptional(Optional<T> optional)
T from可选(可选)
当T解析为另一个泛型类(如Collection)时

这可能在mapstruct 1.4.2版本中得到解决。

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

e、 g.方法签名,例如

<T> T fromOptional(Optional<T> optional)
T from可选(可选)
当T解析为另一个泛型类(如Collection)时


这可以在mapstruct 1.4.2.版本中解决。

不使用映射方法生成的代码。Collection Collection=fromOptional(programAggregate.getPrograms());1.2中的代码是什么样子的?fromOptional方法看起来怎么样?没有映射方法生成的代码。Collection Collection=fromOptional(programAggregate.getPrograms());[使用Mapstruct 1.3.0.Final]它应该生成如下内容:Collection Collection=mapPrograms(fromOptional(programAggregate.getPrograms());[With Mapstruct 1.2.0.Final]fromOptional方法是:默认的T fromOptional(Final Optional o){return o.orElse(null);}不使用映射方法生成的代码。Collection Collection=fromOptional(programAggregate.getPrograms());1.2中的代码是什么样子的?fromOptional方法看起来怎么样?没有映射方法生成的代码。Collection Collection=fromOptional(programAggregate.getPrograms());[使用Mapstruct 1.3.0.Final]它应该生成