在 Eclipse 项目中使用 MapStruct 将“脏”字符串字段映射为双精度

Posted

技术标签:

【中文标题】在 Eclipse 项目中使用 MapStruct 将“脏”字符串字段映射为双精度【英文标题】:Mapping of "dirty" string fields to double using MapStruct in an Eclipse project 【发布时间】:2019-04-13 13:02:23 【问题描述】:

鉴于:

我在我的 Eclipse 项目中使用 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.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() ) );

似乎根本没有使用命名方法。我仍然收到与添加之前相同的错误。

【问题讨论】:

【参考方案1】:

我刚试过你的映射器

@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

【讨论】:

好点。但我查了一下,它是正确的版本。但你的回答让我找到了一个更简单的失败原因。【参考方案2】:

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

完整的 maven 全新安装后,新的映射器已创建,一切正常。

【讨论】:

我建议您通过mapstruct.org/documentation/ide-support/#eclipse 使用 Eclipse 设置您的项目

以上是关于在 Eclipse 项目中使用 MapStruct 将“脏”字符串字段映射为双精度的主要内容,如果未能解决你的问题,请参考以下文章

MapStruct在项目中封装使用

Spring不在JHipster Web应用程序中注入Mapstruct生成的类

属性映射工具——MapStruct

属性映射工具——MapStruct

属性复制神器-mapstruct

Mapstruct官方参考文档中的一些使用规则