Mapstruct: отображение «грязных» строковых полей на удвоение - PullRequest
1 голос
/ 13 апреля 2019

Дано:

String SourcePojo.area = "120,5 sqm"
double TargetPojo.area = 120.5

Я могу преобразовать "грязную" строку в число следующим образом:

double extractDoubleFromString(String string) throws ParseException{
    NumberFormat format = NumberFormat.getInstance(Locale.GERMAN);
    return format.parse(string).doubleValue();
}

Что я пробовал

Используя Mapstruct, я написал этот Mapper:

@Mapper
public interface MyMapper {

    MyMapper INSTANCE = Mappers.getMapper(MyMapper.class);


    @Mapping(source="space", target="space", qualifiedByName="StringToDouble")
    TargetPojo mapSourceToTarget(TargetPojo aAED);

    @Named("StringToDouble")
    default double extractDoubleFromString(String string) throws ParseException{
        NumberFormat format = NumberFormat.getInstance(Locale.GERMAN);
        return format.parse(string).doubleValue();
    }
}

В сгенерированном MapperImpl я нашел этот код:

    if ( aAED.getSpace() != null ) {
        targetPojo.space( Double.parseDouble( aAED.getSpace() ) );
    }

Похоже, что названный метод вообще не используется. Я все еще получаю ту же ошибку, что и до того, как добавил ее.

Ответы [ 2 ]

0 голосов
/ 14 апреля 2019

Код в порядке и должен работать.Причиной этого не было то, что MapStruct вызывается не обычным Eclipse Builder, а через процесс сборки Maven.(По крайней мере, это верно для моей установки)

После полной установки maven clean был создан новый mapper, и все работало хорошо.

0 голосов
/ 14 апреля 2019

Я только что попробовал ваш картограф

@Mapper
public interface MyMapper {

    MyMapper INSTANCE = Mappers.getMapper(MyMapper.class);

    @Mapping(source = "space", target = "space", qualifiedByName = "StringToDouble")
    TargetPojo mapSourceToTarget(SourcePojo aAED);

    @Named("StringToDouble")
    default double extractDoubleFromString(String string) throws ParseException {
        NumberFormat format = NumberFormat.getInstance(Locale.GERMAN);
        return format.parse(string).doubleValue();
    }
}

И это генерирует:

try {
    targetPojo.setSpace( extractDoubleFromString( aAED.getSpace() ) );
}
catch ( ParseException e ) {
    throw new RuntimeException( e );
}

Одна из причин, по которой он может не сработать, заключается в том, что вы используете не org.mapstruct.Named, а некоторые @Named из другого пакета.

...