Java Mapstruct:;肮脏的;要加倍的字符串字段

Java Mapstruct:;肮脏的;要加倍的字符串字段,java,mapping,number-formatting,mapstruct,Java,Mapping,Number Formatting,Mapstruct,给定: 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.

给定:

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
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() ) );
    }

看起来根本没有使用命名方法。我仍然得到与添加之前相同的错误。

我刚刚尝试了你的映射程序

@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

我刚刚试用了您的映射器

@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

代码完全正常,应该可以工作。 之所以没有,是因为MapStruct不是由普通的Eclipse构建器调用的,而是通过Maven构建过程调用的。(至少我的设置是这样的)


在完成maven clean安装后,创建了新的映射程序,一切正常。

代码完全正常,应该可以工作。 之所以没有,是因为MapStruct不是由普通的Eclipse构建器调用的,而是通过Maven构建过程调用的。(至少我的设置是这样的)


在完成maven clean安装后,创建了新的映射程序,一切都很好。

好的一点。但是我检查了一下,它是正确的版本。但你的回答让我找到了一个更简单的失败原因。说得好。但是我检查了一下,它是正确的版本。但是你的回答让我找到了一个更简单的失败原因。我建议你通过Eclipse设置项目。我建议你通过Eclipse设置项目