首页 > 解决方案 > 在使用 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") 是如何改变映射过程以使映射对象和源对象不同的呢?

标签: javatestngdozer

解决方案


@Mapping当源类和目标类中的字段名称不同时使用注释。

例如,下面的代码会将fullName源类对象中的name字段映射到目标类对象中的字段。这在映射两个不同类的对象时特别有用。

@Mapping("fullName")
private int name;

因此,如果我们@Mapping("this")name字段上使用,那么它将源类本身映射到name字段。在这里,由于name是 type StringtoString()源类的表示将被映射到该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()方法来检查各个字段的相等性,因此源对象和映射对象将相等。


推荐阅读