以递归方式将属性从一个bean复制到另一个bean(不是同一个类)(包括嵌套bean)

Ser*_*auk 9 java spring javabeans spring-bean

哪种方法需要最少量的自己编写的代码来实现一个bean到另一个bean的深层复制?目标是在源名称和目标属性按名称匹配时以自动方式执行此操作.

源主豆:

public class SourceBean {
    private String beanField;
    private SourceNestedBean nestedBean;

    // getters and setters
}
Run Code Online (Sandbox Code Playgroud)

源嵌套bean:

public class SourceNestedBean {
    private String nestedBeanField;

    // getters and setters
}
Run Code Online (Sandbox Code Playgroud)

目标主bean:

public class TargetBean {
    private String beanField;
    private TargetNestedBean nestedBean;

    // getters and setters        
}
Run Code Online (Sandbox Code Playgroud)

目标嵌套bean:

public class TargetNestedBean {
    private String nestedBeanField;

    // getters and setters
}
Run Code Online (Sandbox Code Playgroud)


使用例如Spring BeanUtils.copyProperites()我可以使用一行代码创建一个SourceBeanto 的浅表副本,TargetBean但它不会复制嵌套bean.是否有任何成熟的实用程序(不一定是Spring Framework)允许在编写尽可能少的代码时进行深层复制(与BeanUtils.copyProperties()几乎相同)?

Fed*_*ner 14

一种方法是通过以下方法Jackson合作ObjectMapper:convertValue()

ObjectMapper mapper = new ObjectMapper();
SourceBean source = ...;
TargetBean target = mapper.convertValue(source, TargetBean.class);
Run Code Online (Sandbox Code Playgroud)

请注意,convertValue()重载也适用于泛型类型.还要注意,convertValue()在某些情况下会返回您提供的值,例如SourceBean是否可以赋值给TargetBean.

由于Jackson是一个JSON序列化/反序列化库,在内存中convertValue()序列化为sourceJSON,然后将此JSON反序列化为一个实例TargetBean.所以不能期待高性能.但是,使用一行代码执行转换.

如果您需要性能,最好是手动进行映射.没有比这更好的了.

如果您需要简单,请使用Jackson,如上所述.

一个很好的权衡是Orika,一个高性能的映射器,几乎没有配置不使用反射.