带有嵌套映射器和未映射的 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 版本中将包含一个修复程序。但是,我无法确定此版本何时发布。
我想将 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 版本中将包含一个修复程序。但是,我无法确定此版本何时发布。