ModelMapper 中的自定义转换器不起作用
Custom converter in ModelMapper not working
我有一个可以将双精度型转换为字符串型的转换器。在转换之前,我想将 double 格式化为固定的小数位。但我注意到它没有被调用。这是我的方法:
我拥有的两个模型具有相同的属性名称。
private String price; // my DTO
private Double price; // my JPA entity
这是我的 modelMapper bean ModelMapperConfig.java
:
public ModelMapper modelMapper() {
ModelMapper modelMapper = new ModelMapper();
modelMapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT);
modelMapper.getConfiguration().setAmbiguityIgnored(true);
modelMapper.addConverter(convertDoubleToString());
return modelMapper;
}
private Converter<Double, String> convertDoubleToString() {
return mappingContext -> Utility.formatDoubleToString(mappingContext.getSource());
}
ModelMapper
正在将我的 Double
映射到 String
很好。
但它没有保持格式化的小数位。知道我错过了什么吗?
像这样将转换器直接添加到 ModelMapper:
modelMapper.addConverter(convertDoubleToString());
如果实现 Converter 接口,我从来没有完全工作过。幸运的是,您可以针对 TypeMap 注册您的转换器,所以这应该可以工作:
modelMapper.createTypeMap(Double.class, String.class)
.setConverter(convertDoubleToString());
另一种成功注册的方法是扩展 AbstractConverter,这是一种更丑陋的方法:
private AbstractConverter<Double, String> convertDoubleToString =
new AbstractConverter<>() {
@Override
protected String convert(Double src) {
return Utility.formatDoubleToString(src);
}
};
然后这有效:
modelMapper.addConverter(convertDoubleToString);
差异可能是(所以只是猜测)由于类型擦除,ModelMapper 在实现接口时可能无法正确关联转换器,因此它需要显式类型映射。
我有一个可以将双精度型转换为字符串型的转换器。在转换之前,我想将 double 格式化为固定的小数位。但我注意到它没有被调用。这是我的方法:
我拥有的两个模型具有相同的属性名称。
private String price; // my DTO
private Double price; // my JPA entity
这是我的 modelMapper bean ModelMapperConfig.java
:
public ModelMapper modelMapper() {
ModelMapper modelMapper = new ModelMapper();
modelMapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT);
modelMapper.getConfiguration().setAmbiguityIgnored(true);
modelMapper.addConverter(convertDoubleToString());
return modelMapper;
}
private Converter<Double, String> convertDoubleToString() {
return mappingContext -> Utility.formatDoubleToString(mappingContext.getSource());
}
ModelMapper
正在将我的 Double
映射到 String
很好。
但它没有保持格式化的小数位。知道我错过了什么吗?
像这样将转换器直接添加到 ModelMapper:
modelMapper.addConverter(convertDoubleToString());
如果实现 Converter 接口,我从来没有完全工作过。幸运的是,您可以针对 TypeMap 注册您的转换器,所以这应该可以工作:
modelMapper.createTypeMap(Double.class, String.class)
.setConverter(convertDoubleToString());
另一种成功注册的方法是扩展 AbstractConverter,这是一种更丑陋的方法:
private AbstractConverter<Double, String> convertDoubleToString =
new AbstractConverter<>() {
@Override
protected String convert(Double src) {
return Utility.formatDoubleToString(src);
}
};
然后这有效:
modelMapper.addConverter(convertDoubleToString);
差异可能是(所以只是猜测)由于类型擦除,ModelMapper 在实现接口时可能无法正确关联转换器,因此它需要显式类型映射。