AKJ*_*AKJ 3 java model converters modelmapper
我有一个将双精度数转换为字符串的转换器。在转换之前,我想将双精度格式格式化为固定的小数位数。但我注意到它没有被调用。这是我的方法:
我的两个模型具有相同的属性名称。
private String price; // my DTO
private Double price; // my JPA entity
Run Code Online (Sandbox Code Playgroud)
这是我的 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());
}
Run Code Online (Sandbox Code Playgroud)
正在ModelMapper将我映射Double到String罚款。
但它不遵守格式化的小数位。知道我缺少什么吗?
直接将转换器添加到 ModelMapper,如下所示:
modelMapper.addConverter(convertDoubleToString());
Run Code Online (Sandbox Code Playgroud)
如果实现转换器接口,对我来说从来没有完全有效。幸运的是,您可以根据 TypeMap 注册转换器,因此这应该可以工作:
modelMapper.createTypeMap(Double.class, String.class)
.setConverter(convertDoubleToString());
Run Code Online (Sandbox Code Playgroud)
成功注册的另一种方法是扩展 AbstractConverter ,这是一种更难看的方法:
private AbstractConverter<Double, String> convertDoubleToString =
new AbstractConverter<>() {
@Override
protected String convert(Double src) {
return Utility.formatDoubleToString(src);
}
};
Run Code Online (Sandbox Code Playgroud)
然后这有效:
modelMapper.addConverter(convertDoubleToString);
Run Code Online (Sandbox Code Playgroud)
差异可能是(所以只是猜测),由于类型擦除,在实现 Interface 时 ModelMapper 可能无法正确关联转换器,因此它需要显式类型映射。