【问题标题】:ModelMapper: apply rule to all fields of typeModelMapper:将规则应用于所有类型的字段
【发布时间】:2021-06-02 18:17:32
【问题描述】:

我有一个包含很多字符串字段(有些是其他类型)的 DTO。
在将对象映射到另一个类似类的对象时,我需要对 String 类型的所有字段应用转换,在本例中为 trim()

所以,我有:

class MyDTO {
  String name;
  String type;
  String company;
  String status;
  String whatever;
  ... (there are about 80 String fields)
  int someNumber;
  double otherNumber;
}
class DestinationDTO { // has just some fields of MyDTO
  String name;
  String type;
  String company;
  String whatever;
  int somenumber;
}

我尝试过的:

Converter<String, String> myConverter = c -> c.getSource().trim();
ModelMapper mm = new ModelMapper();
...
mm.typeMap(MyDTO.class, DestinationDTO.class)
  .addMappings(c -> c
      .using(myConverter)
      .map(MyDTO::getName, DestinationDTO::getName)
    ) // this applies to just one field, I need all String fields

有没有办法一次性指定一个类的所有字符串字段,而不必列出它们?

尝试搜索 modelmapper.org 文档,但我看到的只是一一配置字段。

有什么想法吗?

【问题讨论】:

  • 请通过tour 了解 Stack Overflow 的工作原理,并阅读How to Ask 了解如何提高问题的质量。然后edit你的问题包括你拥有的完整源代码作为minimal reproducible example,其他人可以编译和测试。请显示您尝试过的尝试以及您从尝试中得到的问题/错误消息。你试过转换器吗?
  • 是的,我试过了。用一个例子更新了我的问题

标签: java modelmapper


【解决方案1】:

您可以使用converters 指定从一种类型到另一种类型的转换。源和目标类型可以相同。使用addConverter&lt;S,D&gt;() 方法将通用转换器添加到 ModelMapper 本身(而不是单独添加到特定字段)。你可以这样使用它:

ModelMapper mm = new ModelMapper();
Converter<String, String> myConverter = new AbstractConverter<String, String>() {
    protected String convert(String source) {
        return source == null ? null : source.trim();
    }
};
mm.addConverter(myConverter);
mm.getConfiguration().setFieldMatchingEnabled(true);
MyDTO source = new MyDTO();
source.name = "   abc    \t";
source.company = "\nd   e  f  \n";

DestinationDTO target = mm.map(source, DestinationDTO.class);
System.out.printf("Target.name: '%s'%n", target.name);
System.out.printf("Target.company: '%s'%n", target.company);

输出将如预期:

Target.name: 'abc'
Target.company: 'd   e  f'

【讨论】:

  • @kit 另见this。您可以在此答案中将转换器设置为映射器的“根级别”,但在这种情况下,实现需要扩展 AbstractConverter (正如在此答案中所做的那样)。由于某种原因,实现接口转换器不会有相同的效果。
  • AbstractConverter 是最棘手的部分。希望这个用例被正确记录......无论如何,我能够实现我所需要的。我想,如果转换器是使用.createTypeMap() 设置的,那么它也被设置在“根级别”,因为该规则将适用于所有&lt;String, String&gt; 字段。如果可以为特定的 对添加转换器会很好
猜你喜欢
  • 2016-01-26
  • 2020-04-06
  • 2012-05-30
  • 1970-01-01
  • 2021-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多