【问题标题】:Custom converter in ModelMapper not workingModelMapper 中的自定义转换器不起作用
【发布时间】:2021-08-28 10:54:56
【问题描述】:

我有一个将双精度转换为字符串的转换器。在转换之前,我想将双精度格式化为固定的小数位数。但我注意到它没有被调用。这是我的方法:

我拥有的两个模型具有相同的属性名称。

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 很好。

但它没有保持格式化的小数位。知道我缺少什么吗?

【问题讨论】:

    标签: java model converters modelmapper


    【解决方案1】:

    像这样直接将转换器添加到 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 在实现接口时可能无法正确关联转换器,因此它需要显式类型映射。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-03
      • 1970-01-01
      • 2012-09-10
      • 2016-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多