在 Eclipse 项目中使用 MapStruct 将 "dirty" 字符串字段映射为 double
Mapping of "dirty" string fields to double using MapStruct in an Eclipse project
给定:
我在我的 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() ) );
}
看起来命名方法根本没有被使用。我仍然得到与添加之前相同的错误。
我刚试过你的映射器
@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 Builder 调用的,而是通过 Maven 构建过程调用的。 (至少我的设置是这样)
完成 maven 全新安装后,新映射器已创建,一切正常。
给定:
我在我的 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() ) );
}
看起来命名方法根本没有被使用。我仍然得到与添加之前相同的错误。
我刚试过你的映射器
@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 Builder 调用的,而是通过 Maven 构建过程调用的。 (至少我的设置是这样)
完成 maven 全新安装后,新映射器已创建,一切正常。