配置说明

目标类配置说明

因为每个类均可能拷贝到多个目标,例如:FooDto可能会拷贝到Foo,也可能拷贝到FooVo等。并且拷贝到不同目标时需要的映射配置一般来说是有差异的。

从2.3.0版本开始,所有的映射类注解(@Mapping/@DictMapping/@Nested)均支持目标类的配置(targetClass/targetClassName),用于区分此注解配置的作用目标,防止拷贝时发生意外的处理。

@Mapping注解为例:

示例1

class A {
   @Mapping(targetClass=B.class, field="b")
   @Mapping(targetClass=C.class, field="c")
   String a;
}
  • A和B类的实例互相拷贝时,A.a映射字段为B.b

  • A和C类的实例互相拷贝时,A.a映射字段为C.c

  • A和D类(所有其他的类)的实例互相拷贝时,A.a映射字段为D.a

示例2

class A {
   @Mapping(targetClass=B.class, field="b")
   @Mapping(targetClass=C.class, field="c")
   @Mapping(field="d")
   String a;
}
  • A和B类的实例互相拷贝时,A.a映射字段为B.b

  • A和C类的实例互相拷贝时,A.a映射字段为C.c

  • A和D类(所有其他的类)的实例互相拷贝时,A.a映射字段为D.d

不配置targetClass表示通用配置,BeanUtils在拷贝时会选取第一个匹配的注解,所以通用配置必须放在最后。

类(Class)类型的属性配置说明

某些情况下参与拷贝的类(如DTO)可能需要单独打包供其他系统使用,此时如果注解中有Class类型的属性,可能会因为和其他类的耦合导致打包失败(或者打包内容中包含各种不需要的类)。

从2.3.0版本开始,所有的映射类注解(@Mapping/@DictMapping/@Nested)中类型为Class的属性配置,均提供对应的className(类的全路径名)配置,用于避免和系统中其他类的耦合问题。

@DictMapping注解为例:

修改前

package demo;

class A {
   @DictMapping(targetClass=B.class, key="", resolver=MyResolver.class)
   String a;
}
  • A和B类的实例互相拷贝时,A.a和映射字段B.a采用MyResolver类处理字典映射

  • A和C类(所有其他的类)的实例互相拷贝时,A.a和映射字段C.a原样拷贝(不使用配置的字典映射)

修改后

package demo;

class A {
   @DictMapping(targetClassName="demo.B", key="", resolverClassName="demo.MyResolver")
   String a;
}

修改前后的效果是相同的。

className属性配置的优先级高于class属性的优先级。

Last updated