mapstruct / mapstruct/mapstruct

Support overloading for target

Open
#1,135 6 comments 2 reactions 1 assignee View on GitHub

@filiphr is already working on this.

Since Apr 20, 2017.

enhancement
Dominant language
Java
Stars
7.7k
Forks
1.1k
PR merge metrics
No merged PRs in 30d

Description

Mapstruct does support overloading of target setters(see: Issue892Test test) but choosing preferred type logic is based on getter type of target - not source, which looks a bit strange.
org.mapstruct.ap.internal.model.common.Type#getPropertyWriteAccessors: line 465

Please see unit test:
Source:

public class Source {

    private Date updatedOn;

    public Source(Date updatedOn) {
        this.updatedOn = updatedOn;
    }

    public Date getUpdatedOn() {
        return updatedOn;
    }

    public void setUpdatedOn(Date updatedOn) {
        this.updatedOn = updatedOn;
    }
}

Target:

public class Target {

    private long updatedOn;

    public long getUpdatedOn() {
        return updatedOn;
    }

    public void setUpdatedOn( long updatedOn ) {
        this.updatedOn = updatedOn;
    }

    public void setUpdatedOn( Date updatedOn ) {
        if (updatedOn == null) {
            return;
        }
        this.updatedOn = updatedOn.getTime();
    }

}

Mapper:

@Mapper
public interface SourceTargetMapper {

    SourceTargetMapper INSTANCE = Mappers.getMapper( SourceTargetMapper.class );

    @Mapping(target = "updatedOn", source = "updatedOn")
    Target sourceToTarget( Source source );

}

UnitTest:

@WithClasses({
        SourceTargetMapper.class,
        Source.class,
        Target.class
})
@RunWith(AnnotationProcessorTestRunner.class)
public class OverloadingTest {

    @Test
    public void testShouldGenerateCorrectMapperImplementation() {
        Source source = new Source( new Date() );
        Target target = SourceTargetMapper.INSTANCE.sourceToTarget( source );
        Assert.assertTrue( target.getUpdatedOn() > 0 );
    }

}

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.