java - ModelMapper:将规则应用于所有类型的字段
问题描述
我有一个带有很多字符串字段的 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 文档,但我看到的只是一一配置字段。
有任何想法吗?
解决方案
您可以使用转换器来指定从一种类型到另一种类型的转换。源和目标类型可以相同。使用该addConverter<S,D>()
方法将通用转换器添加到 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'
推荐阅读
- bash - 处理中的替换命令。ebextensions
- python-3.x - 使用 Gensim 在 Python 中重新训练预训练的词嵌入
- azure-active-directory - 使用 Azure AD 进行 Azure 应用服务身份验证 - 为什么需要 AD 应用?
- vue.js - 模块解析失败:意外字符 '@' (1:0) vuejs 、 vuetify 和 vuex
- node.js - npm 错误!错误:EACCES:权限被拒绝,打开
- laravel - Laravel - 语法错误,意外')',期待'['
- sqlite - 从多个 .db 文件中批量提取
- numpy - `arr[tuple(seq)]` 和 `arr[seq]` 有什么区别?不推荐使用与使用非元组序列进行多维索引相关的内容
- html - 如何解决土耳其网站中的连字问题?
- java - 识别由于夏令时而重复的日期/时间