mapstruct icon indicating copy to clipboard operation
mapstruct copied to clipboard

The resulting implementation class does not have a set value

Open mawl01 opened this issue 10 months ago • 1 comments

Expected behavior

   public class SysManagerApplicationMapImpl implements SysManagerApplicationMap {
        public SysManagerApplicationMapImpl() {
        }

    public List<SysManagerApplicationListModel> toModelList(List<SysManagerApplicationDO> sysManagerApplicationDO) {
        if (sysManagerApplicationDO == null) {
            return null;
        } else {
            List<SysManagerApplicationListModel> list = new ArrayList(sysManagerApplicationDO.size());
            Iterator var3 = sysManagerApplicationDO.iterator();

            while(var3.hasNext()) {
                SysManagerApplicationDO sysManagerApplicationDO1 = (SysManagerApplicationDO)var3.next();
                list.add(this.sysManagerApplicationDOToSysManagerApplicationListModel(sysManagerApplicationDO1));
            }

            return list;
        }
    }

    protected SysManagerApplicationListModel sysManagerApplicationDOToSysManagerApplicationListModel(SysManagerApplicationDO sysManagerApplicationDO) {
        if (sysManagerApplicationDO == null) {
            return null;
        } else {
            SysManagerApplicationListModel sysManagerApplicationListModel = new SysManagerApplicationListModel();
            sysManagerApplicationListModel.setAppName(sysManagerApplicationDO.getAppName())
            return sysManagerApplicationListModel;
        }
    }
}

Actual behavior

    public class SysManagerApplicationMapImpl implements SysManagerApplicationMap {
        public SysManagerApplicationMapImpl() {
        }

    public List<SysManagerApplicationListModel> toModelList(List<SysManagerApplicationDO> sysManagerApplicationDO) {
        if (sysManagerApplicationDO == null) {
            return null;
        } else {
            List<SysManagerApplicationListModel> list = new ArrayList(sysManagerApplicationDO.size());
            Iterator var3 = sysManagerApplicationDO.iterator();

            while(var3.hasNext()) {
                SysManagerApplicationDO sysManagerApplicationDO1 = (SysManagerApplicationDO)var3.next();
                list.add(this.sysManagerApplicationDOToSysManagerApplicationListModel(sysManagerApplicationDO1));
            }

            return list;
        }
    }

    protected SysManagerApplicationListModel sysManagerApplicationDOToSysManagerApplicationListModel(SysManagerApplicationDO sysManagerApplicationDO) {
        if (sysManagerApplicationDO == null) {
            return null;
        } else {
            SysManagerApplicationListModel sysManagerApplicationListModel = new SysManagerApplicationListModel();
            return sysManagerApplicationListModel;
        }
    }
}

Steps to reproduce the problem

1. pom.xml configuration

   <build>
          <plugins>
              <plugin>
                  <groupId>org.apache.maven.plugins</groupId>
                  <artifactId>maven-compiler-plugin</artifactId>
                  <version>3.8.1</version>
                  <configuration>
                      <source>1.8</source>
                      <target>1.8</target>
                      <annotationProcessorPaths>
                          <path>
                              <groupId>org.mapstruct</groupId>
                              <artifactId>mapstruct-processor</artifactId>
                              <version>1.5.5.Final</version>
                          </path>
                      </annotationProcessorPaths>
                  </configuration>
              </plugin>
          </plugins>
      </build>

2. class

@Mapper
public interface SysManagerApplicationMap {
        SysManagerApplicationMap INSTANCE = Mappers.getMapper(SysManagerApplicationMap.class);

        List<SysManagerApplicationListModel> toModelList(List<SysManagerApplicationDO> sysManagerApplicationDO);
}

MapStruct Version

1.5.5.Final

mawl01 avatar Apr 26 '24 03:04 mawl01

@mawl01 the code you've shared does not look like code that MapStruct generates. It looks like code that has been decompiled from bytecode. Can you please share an example project where we can reproduce this

filiphr avatar Apr 27 '24 10:04 filiphr

Facing the same issue using 1.6.0.Beta1 where deeply nested source objects are missing the setter codes in the target object.

Situation

Mapping(source = "a.b.c.d1", target = "name") D2 aToD2(A a);

Expected Behaviour

D2 d1ToD2(D1 d1) {
  if (d1 == null) {
    return;
  }
  
  D2 d2 = new D2();
  d2.setName( d1.getName() );

  return d2;
}

Actual Behaviour

D2 d1ToD2(D1 d1) {
  if (d1 == null) {
    return;
  }
  
  D2 d2 = new D2();
  // missing d2.setName( d1.getName() );

  return d2;
}

As a result, the target object is being created but with its fields not populated.

MapStruct Version

1.6.0.Beta1

alantanlc avatar May 14 '24 06:05 alantanlc

@alantanlc As I wrote in #3575, could you please provide a reproducer?

  • https://github.com/mapstruct/mapstruct/issues/3575#issuecomment-2113311647

thunderhook avatar May 15 '24 21:05 thunderhook

@thunderhook ok i will share a reproducible example soon, thank you!

alantanlc avatar May 20 '24 07:05 alantanlc

Closing this for now. Once we have a reproducer from @alantanlc we'll reopen it.

filiphr avatar Jun 01 '24 10:06 filiphr