java - 在使用 github 的 dozermapper 时在字段上使用带有“this”值(@Mapping("this"))的映射注释的使用
问题描述
我看到了一个@Mapping("this")
添加到字段的类和一个测试方法,该方法在调用 github 的 dozermapper 中的 map 方法后检查源对象和结果对象是否不相等。
由于我无法发布实际代码,因此我在下面添加了一个类似的类和测试方法。(我使用了 lombok@Data
和注解来避免显式指定 getter、setter 和构造函数。@NoArgsConstructor
)@AllArgsConstructor
@Data
@NoArgsConstructor
@AllArgsConstructor
public class TestObj
{
private int id;
@Mapping("this")
private String name;
}
测试方法 :
@Test
public void testMapper() {
TestObj testObj = new TestObj(1, "test");
TestObj testCopy = DozerBeanMapperBuilder.create().build().map(testObj, TestObj.class);
Assert.assertNotEquals(testObj, testCopy);
}
测试通过了。如果我删除@Mapping("this")
,那么相同的测试将失败。那么@Mapping("this") 是如何改变映射过程以使映射对象和源对象不同的呢?
解决方案
@Mapping
当源类和目标类中的字段名称不同时使用注释。
例如,下面的代码会将fullName
源类对象中的name
字段映射到目标类对象中的字段。这在映射两个不同类的对象时特别有用。
@Mapping("fullName")
private int name;
因此,如果我们@Mapping("this")
在name
字段上使用,那么它将源类本身映射到name
字段。在这里,由于name
是 type String
,toString()
源类的表示将被映射到该name
字段。int
如果我们使用了不兼容的类型,例如name
字段,则会引发异常。如果源对象的类型与源对象的类型相同或相同,源对象本身将被存储在该name
字段中。Object
因此,在给定的问题中,源类和目标类是相同的,但@Mapping("this")
提供给该name
字段。因此,如果源对象是TestObj(id=1,name="test")
,那么映射的对象就是TestObj(id=1,name="TestObj(id=1,name="test")"
,即该name
字段是toString()
源对象的 。因此,两个对象将不相等。
如果@Mapping("this")
删除,测试将失败,因为@Data
注释添加了一个equals()
方法来检查各个字段的相等性,因此源对象和映射对象将相等。
推荐阅读
- php - 调用“in_array”似乎不起作用
- fortran - Fortran 如何处理可选参数和字符串?
- machine-learning - 如何使用在数据集上训练的 SVC ML 模型预测新患者的结果
- jquery - 使用 mindmup / editable-table 更改表格时如何获取单元格名称和行 ID
- django - 如何默认激活所有管理命令的翻译?
- java - 在java中的链接哈希图中查找特定键的值
- javascript - 不同环境下的 Babel 和 Lerna 设置问题
- c# - 在连接中选择多个字段
- java - 如何摆脱警告:计划从未来的 JDK 版本中删除 Nashorn 引擎?
- c# - 在当前控制台行的开头插入文本而不覆盖