开发者社区> 问答> 正文

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

我想将映射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”。

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

问题来源:Stack Overflow

展开
收起
montos 2020-03-27 14:28:22 774 0
1 条回答
写回答
取消 提交回答
  • 关于mapstruct问题跟踪器,以下条目似乎涵盖了您的问题。

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

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

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

    回答来源:Stack Overflow

    2020-03-27 14:28:38
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载