带有嵌套映射器和未映射的 SourcePolicy 的 Mapstruct Bug

Mapstruct Bug with nested mapper and unmappedSourcePolicy

我想将 EmployeeDto 映射到 EmployeeValue。考虑以下 类:

public class EmployeeDto {

    private String telephoneNumber;
    private Integer companyId;

    public String getTelephoneNumber() {
        return telephoneNumber;
    }

    public void setTelephoneNumber(String telephoneNumber) {
        this.telephoneNumber = telephoneNumber;
    }


    public Integer getCompanyId() {
        return companyId;
    }

    public void setCompanyId(Integer companyId) {
        this.companyId = companyId;
    }

}


public class EmployeeValue {

    private String telephoneNumber;
    private Company company;

    public String getTelephoneNumber() {
        return telephoneNumber;
    }

    public void setTelephoneNumber(String telephoneNumber) {
        this.telephoneNumber = telephoneNumber;
    }

    public Company getCompany() {
        return company;
    }

    public void setCompany(Company company) {
        this.company = company;
    }

}


public class Company {

    private Integer id;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

}

我正在尝试使用 mapstruct-mapper 映射那些 类:

@Mapper(componentModel = "cdi")
public interface EmployeeDto2EmployeeValueMapper {

    @Mapping(source ="companyId", target = "company.id")
    EmployeeValue map(EmployeeDto dto);

}

这工作得很好,因为这个测试运行绿色:

class EmployeeDto2EmployeeValueMapperTest {

    private static final String TELEPHONE_NUMBER = "telephoneNumber";
    private static final int COMPANY_ID = 1;

    private EmployeeDto2EmployeeValueMapper classUnderTest = Mappers.getMapper(EmployeeDto2EmployeeValueMapper.class);

    @Test
    void map() {
        EmployeeDto employeeDto = new EmployeeDto();
        employeeDto.setTelephoneNumber(TELEPHONE_NUMBER);
        employeeDto.setCompanyId(COMPANY_ID);

        EmployeeValue outcome = classUnderTest.map(employeeDto);

        assertThat(outcome.getTelephoneNumber(), is(TELEPHONE_NUMBER));
        assertThat(outcome.getCompany().getId(), is(COMPANY_ID));
    }

}

现在,如果我将 unmappedSourcePolicy = ReportingPolicy.ERROR 添加到映射器,即

@Mapper(componentModel = "cdi", unmappedSourcePolicy = ReportingPolicy.ERROR)
public interface EmployeeDto2EmployeeValueMapper {

    @Mapping(source ="companyId", target = "company.id")
    EmployeeValue map(EmployeeDto dto);

}

构建失败并显示以下错误消息: 未映射的源属性:"telephoneNumber".

对我来说这似乎是一个错误,因为这些字段实际上已被映射(正如我之前的测试所证明的那样)。 你对此有什么想法吗?

关于 mapstruct 问题跟踪器,以下条目似乎涵盖了您的问题。

问题:unmappedSourcePolicy 设置为 ERROR 导致嵌套 Bean 问题 #1881

https://github.com/mapstruct/mapstruct/issues/1881

根据问题评论,即将发布的 1.4.0 版本中将包含一个修复程序。但是,我无法确定此版本何时发布。