在使用 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
字段。这里因为 name
是 String
类型,源 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()
方法来检查各个字段的相等性,从而检查源和映射对象将是平等的。
我看到一个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
字段。这里因为 name
是 String
类型,源 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()
方法来检查各个字段的相等性,从而检查源和映射对象将是平等的。