Ошибка Mapstruct с вложенным картографом и unmappedSourcePolicy - PullRequest
0 голосов
/ 13 марта 2020

Я хочу сопоставить 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".

Мне это кажется ошибкой, потому что эти поля действительно были отображены (как доказал мой тест ранее). У вас есть идеи по этому поводу?

1 Ответ

2 голосов
/ 13 марта 2020

Что касается средства отслеживания проблем mapstruct, следующая запись, кажется, покрывает ваш вопрос.

Проблема: unmappedSourcePolicy, установленный в значение ERROR, приводит к проблеме с вложенными компонентами # 1881

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

В соответствии с комментариями к выпуску исправление будет включено в предстоящий выпуск 1.4.0. Тем не менее, я не мог узнать, когда этот релиз произойдет.

...