带有嵌套映射器和unmappedSourcePolicy的Mapstruct Bug

时间:2020-03-13 09:45:26

标签: java mapping mapstruct

我想将// Before DaggerAppComponent.factory().withContext(this).inject(this) val factory: AppWorkerFactory = DaggerAppComponent.factory().withContext(this).workerFactory() WorkManager.initialize(this, Configuration.Builder().setWorkerFactory(factory).build()) // After val daggerAppComponent = DaggerAppComponent.factory().withContext(this) daggerAppComponent.inject(this) val factory: AppWorkerFactory = daggerAppComponent.workerFactory() WorkManager.initialize(this, Configuration.Builder().setWorkerFactory(factory).build()) 映射到EmployeeDto。考虑以下类:

EmployeeValue

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

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;
    }

}

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

@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

生成失败,并显示以下错误消息: 未映射的源属性:“ telephoneNumber”。

在我看来,这似乎是一个错误,因为这些字段实际上已被映射(如我的测试之前所证明的)。 您对此有任何想法吗?

1 个答案:

答案 0 :(得分:2)

关于mapstruct问题跟踪器,以下条目似乎可以解决您的问题。

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

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

根据发布的评论,修复程序将包含在即将发布的1.4.0中。但是,我找不到此版本何时发布。

相关问题