Mapstruct:将“脏”字符串字段映射为双精度

时间:2019-04-13 13:02:23

标签: 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.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 :(得分:0)

我刚刚尝试过您的映射器

string tem=Character.toString(your_character)

这会生成:

def format_custom_text(string, values):
    # Unpack the values
    return string.format(*values)


values = [
    13,
    ['cinnamon raisin', 'maple'],
    'years'
]

# You don't need a dictionary to store the examples
examples = [
    "There are {} bagels in a bakers dozen.",
    "My favorite bagels are {} and {}.",
    "I have not had a pop tart in 14 {}."
]

for single_example in zip(examples, values):
    # Convert each value inside the values list into a list
    placeholder_values = []
    if not type(single_example[1]) == list:
        placeholder_values.append(single_example[1])
    else:
        placeholder_values = single_example[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 ); }

答案 1 :(得分:0)

该代码完全可以正常运行。 造成这种情况的原因不是,正常的Ec​​lipse Builder不会通过Maven构建过程来调用MapStruct。 (至少对于我的设置是正确的)

在完成完整的maven干净安装后,创建了新的映射器,并且一切正常。