在使用 github 的 dozermapper 时在字段上使用具有 "this" 值 (@Mapping("this")) 的映射注释

Usage of Mapping annotation with "this" value (@Mapping("this")) on a field while using github's dozermapper

我看到一个class,其中@Mapping("this")被添加到一个字段和一个测试方法,该方法在调用[中的map方法后检查源对象和结果对象不相等=31=]的推土机。

由于我无法 post 实际代码,因此我在下面添加了类似的 class 和测试方法。 (我使用了 lombok 的 @Data@NoArgsConstructor@AllArgsConstructor 注释来避免显式指定 getter、setter 和构造函数。)

@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 当源和目标中的字段名称 class 不同时使用注释。

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

@Mapping("fullName")
private int name;

因此,如果我们在 name 字段上使用 @Mapping("this"),那么它会将源 class 本身映射到 name 字段。这里因为 nameString 类型,源 class 的 toString() 表示将映射到 name 字段。如果我们为 name 字段使用了不兼容的类型,如 int,则会抛出异常。如果源对象是 Object 类型或与源对象类型相同,则源对象本身将存储在 name 字段中。

因此,在给定的问题中,源和目标 class 相同,但是 @Mapping("this") 提供给 name 字段。因此,如果源对象类似于 TestObj(id=1,name="test"),则映射对象将是 TestObj(id=1,name="TestObj(id=1,name="test")",即 name 字段将是源对象的 toString()。因此这两个对象将不相等。

如果删除 @Mapping("this"),测试将失败,因为 @Data 注释添加了一个 equals() 方法来检查各个字段的相等性,从而检查源和映射对象将是平等的。