Поскольку выводом вашего java-выражения является строка, вы ожидаете, что mapstruct вызовет метод asDate класса DateMapper?
То, что вы ожидаете получить в сгенерированном коде, выглядит примерно так:
...
personBio.setBirthDate( new DateMapper().asDate(fileLine.substring(redactedpackagename.Constants.BIRTH_DATE_START_POS, redactedpackagename.Constants.BIRTH_DATE_END_POS)));
..
Вы правы, это не работает.Я не знаю, почему ...
Вместо этого вы можете импортировать маппер и использовать его в выражении Java, а также проверять ввод с помощью StringUtils:
@Mapper(imports = {DateMapper.class, StringUtils.class})
public interface PersonBioMapper {
@Mapping(target = "birthDate",
expression = "java(new DateMapper().asDate(StringUtils.substring(fileLine, redactedpackagename.Constants.BIRTH_DATE_START_POS, redatcedpackagename.Constants.BIRTH_DATE_END_POS)))")
PersonBio fileLineToPersonBio(String fileLine);
}
Другой способ (более читабельный)?) это как сказать Филиппу, сделать собственное отображение:
@Mapper
public interface PersonBioMapper {
default PersonBio fileLineToPersonBio(String fileLine) {
PersonBio personBio = new PersonBio();
personBio.setBirthDate(new DateMapper().asDate(StringUtils.substring(fileLine,redactedpackagename.Constants.BIRTH_DATE_START_POS, redactedpackagename.Constants.BIRTH_DATE_END_POS)));
return personBio;
}
}