dozer bean
介绍
如您所知,您可以在任何操作系统中将文件或文件夹从源位置复制到目标位置。 您是否考虑过复制基本上是POJO的java对象? 在很多情况下,您需要将源bean的内容复制到目标bean。 我不关心对象的拷贝构造函数,浅拷贝或深拷贝或克隆。 在某些情况下,无论是否具有过滤条件,您都必须将源bean的内容复制到目标位置。 这样做的原因可能有很多,而实现它的方法有很多。 在这篇小文章中,我将向您简要介绍一个名为“推土机”的框架,以最简单,最可靠的方式实现此功能。
技术性
这篇小文章将为您提供“推土机”框架实用程序,将源Bean复制到目标Bean。 在开始之前,让我们考虑以下情况:您有一个包含很多字段的源Bean,并且该源Bean属于另一个项目或模块。 现在,您想将Bean作为Web服务REST服务开发的一部分向外界公开。 不建议这样做。 可能有以下原因。
- 源系统由于安全漏洞而不允许这样做。
- 源Bean未序列化并且是最终类。
- 源bean有很多字段。 其中一些不是必需的。
- 源bean非常重,并且包含许多嵌套bean。
- 源bean具有其他系统可能不需要的不同类型的字段。
以上可能是某些其他特定原因,请考虑一种情况,您要进行REST调用或Web服务调用以获取某人的最少帐户详细信息。 但是源系统中有一个名为“ AccountBean”的bean,其中包含许多敏感信息,例如个人的网上银行密码,个人资料密码,pan no或社会保险号,总余额等。您想要开发一个仅公开帐户地址的应用程序银行的详细信息,名称和家庭分行。 这是必需的情况,您希望拥有自定义的Bean,该Bean应根据帐号暴露给外部。 在这种情况下,您必须将原始bean复制到您自定义的bean中。 要实现此功能,您可以通过以下方式来实现。
- 编写代码以手动将源Bean的内容复制到目标Bean。
- 使用java Reflection或Introspection实用程序将其从源复制到目标Bean。
- 使用可自动进行复制的可用框架。
在这种情况下,我们将学习一个框架,该框架可帮助我们将源bean的内容复制到目标bean。 称为“推土机”的框架非常流行,可以灵活地在应用程序中使用和集成。 您可以在各种互联网站点上找到有关推土机的更多文档。 在这篇文章中,我将为您提供Dozer的非常基础和实际的用法。
在以下情况下,让我们快速学习推土机的用法。
- 将源Plain / Flat bean复制到目标Plain / Flat bean
- 复制收藏
- 双向bean复制
- 将扁豆复制到嵌套豆,反之亦然
- 通过自定义转换复制bean。
将源Plain / Flat bean复制到目标Plain / Flat bean
这是最简单的情况,当我们有一个源POJO并想复制到目标POJO时。 让我们考虑以下Java代码。
源POJO的结构如下。
package com.ddlab.rnd.type1.srcpkg;/*** The Class Person is used as a source bean for Person which contains Address* object.* * @author <a href="mailto:debadatta.mishra@gmail.com">Debadatta Mishra</a>* @since 2013*/
public class Person {/** The name. */private String name;/** The age. */private int age;/** The adrs. */private Address adrs;// All getter and setter method below}
目标POJO的结构如下。
package com.ddlab.rnd.type1.destnpkg;/*** The Class Person1 is used as destination bean for Person1 which contains* Addrss1 object* * @authorDebadatta Mishra* @since 2013*/
public class Person1 {/** The name1. */private String name1;/** The age1. */private int age1;/** The adrs1. */private Address1 adrs1;//All getter setter method below}
让我们看一下名为“ dozerMapping.xml”的推土机映射文件。
<?xml version="1.0" encoding="UTF-8"?>
<mappings xmlns="http://dozer.sourceforge.net" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://dozer.sourceforge.net http://dozer.sourceforge.net/schema/beanmapping.xsd"><mapping map-id="a"><class-a>com.ddlab.rnd.type1.srcpkg.Person</class-a><class-b>com.ddlab.rnd.type1.destnpkg.Person1</class-b><field><a>name</a><b>name1</b></field><field><a>age</a><b>age1</b></field><field><a>adrs.doorNo</a><b>adrs1.doorNo1</b></field><field><a>adrs.stName</a><b>adrs1.stName1</b></field></mapping>
</mappings>
上面的xml配置文件看起来非常直观,因为<class-a>是指源bean,而<class-b>是指目标bean。 另一个字段<a>引用源Bean的属性,而<b>引用目标Bean的属性。
让我们看一下完成bean映射的最终代码。
List<String> list = new ArrayList<String>();
// Add the mapping configuration
list.add("dozerMapping.xml");
// Add to DozerMapper
Mapper mapper = new DozerBeanMapper(list);
mapper.map(p, p1, "a");
现在完成了,它看起来非常简单,并提供了许多强大的功能。 您已经记住了使用“ Dozer”框架进行bean复制的以下几件事。
- 源豆
- 目标bean
- 推土机映射文件配置
- 映射配置应包含带有正确包名称的源POJO类
- 映射配置应包含具有正确包名称的目标POJO类
- 映射配置应具有您在java类中定义的正确的确切属性名称
映射配置具有以下优点。
- 您可以在需要时更改属性名称,并且不需要构建应用程序。
- 您可以根据需要在Java类中添加该属性。
- 您可以具有一个或多个属性文件来满足特定要求。
- 您可以根据需要编辑和删除映射。
- 您也可以在Spring应用程序中配置映射,即spring配置文件。
复制收藏
在某些情况下,您要将源类型的列表复制到目标类型的列表。 该列表可能包含不同类型的对象。 让我们在下面看到一个典型的Java代码。
package com.ddlab.dozer.type2.srcpkg;
import java.util.List;/*** The Class AddressList is used as a source List object which contains object* of type Address.* * @author <a href="mailto:debadatta.mishra@gmail.com">Debadatta Mishra</a>* @since 2013*/
public class AddressList {/** The adrs list. */private List<Address> adrsList;/*** Gets the adrs list.* * @return the adrs list*/public List<Address> getAdrsList() {return adrsList;}/*** Sets the adrs list.* * @param adrsList* the new adrs list*/public void setAdrsList(List<Address> adrsList) {this.adrsList = adrsList;}}
在上述情况下,该列表包含“地址”类型对象的列表。 让我们学习如何实现。
首先,在地址对象从源到目标之间创建一个映射,然后在源列表到目标列表之间创建一个映射。 让我们看一下映射配置文件。
<?xml version="1.0" encoding="UTF-8"?>
<mappings xmlns="http://dozer.sourceforge.net"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://dozer.sourceforge.net http://dozer.sourceforge.net/schema/beanmapping.xsd"><mapping map-id="k"><class-a>com.ddlab.dozer.type2.srcpkg.Address</class-a><class-b>com.ddlab.dozer.type2.destnpkg.AddressBean</class-b><field><a>name</a><b>name</b></field><field ><a>id</a><b>id</b></field></mapping><mapping map-id="q1" type="one-way" relationship-type="non-cumulative"><class-a>com.ddlab.dozer.type2.srcpkg.AddressList</class-a><class-b>com.ddlab.dozer.type2.destnpkg.AddressBeanList</class-b><field map-id="k"><a>adrsList</a><b>adrsList</b></field></mapping></mappings>
要复制列表对象,可以使用第一种情况下的相同代码。
双向bean复制
在这种情况下,您需要一个在两个方向都进行bean复制的映射。 让我们考虑一下一种情况,您要将内部Java Bean转换为自定义Bean以公开为Web服务,最后在自定义Bean中接收数据并将其转换为内部Bean。 不建议编写另一个映射。 “推土机”在xml映射配置中提供属性,以根据需求在两个方向上进行复制。 我提供了推土机配置中需要提及的属性。
<mapping map-id="k" type="bi-directional">
<!-- Other field mapping -->
</mapping>
上面的属性类型( type="bi-directional"
)提供了type="bi-directional"
复制对象的灵活性。
将扁豆复制到嵌套豆,反之亦然
根据项目需求,您可能有一个复杂的bean,其中包含嵌套的其他java bean。 您可能必须将复杂的bean复制到简单类型,反之亦然。 让我们看看映射配置。
<?xml version="1.0" encoding="UTF-8"?>
<mappings xmlns="http://dozer.sourceforge.net"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://dozer.sourceforge.net http://dozer.sourceforge.net/schema/beanmapping.xsd"><mapping map-id="a"><class-a>com.ddlab.dozer.type4.srcpkg.MyPerson</class-a><class-b>com.ddlab.dozer.type4.destnpkg.Person1</class-b><!-- Other field info --> <field><a>doorNo</a><b>adrs1.doorNo1</b></field><field><a>stName</a><b>adrs1.stName1</b></field><field><a>cname</a><b>adrs1.country.name</b></field><field><a>ccode</a><b>adrs1.country.code</b></field><field><a>fd</a><b>adrs1.country.bd</b></field></mapping></mappings>
在上述情况下,将线标记为红色。 要获得动手示例,请参考以下映射配置文件。
- flat2NestedBeanMapping.xml
- nestedBeanMapping2Flat.xml
请参考以下软件包。
- com.ddlab.dozer.type4.destnpkg
- com.ddlab.dozer.type4.srcpkg
您可以从以下链接下载完整的eclipse项目: https : //www.dropbox.com/s/j6ep7wq7lalfe2k/dozerbeancopy.zip
通过自定义转换复制bean。
这是在发育期间发生的非常典型且复杂的状况。 想象一下,您有一个Java Bean,其中包含特定字段,例如JodaTime api中的日期,UUID类型的对象,BigInteger类型的字段等,并且您有一个具有所有原始类型字段的Java Bean。 在这种情况下,您必须使用自定义转换器并注入“ Dozer”映射配置文件,以便“ Dozer”将自动复制具有适当字段类型的java bean。
让我们看看映射文件的结构。
<?xml version="1.0" encoding="UTF-8"?>
<mappings xmlns="http://dozer.sourceforge.net" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://dozer.sourceforge.net http://dozer.sourceforge.net/schema/beanmapping.xsd"><configuration><custom-converters><converter type="com.ddlab.dozer.type5.converters.Date2JodaDateConverter"><class-a>org.joda.time.LocalDate</class-a><class-b>java.util.Date</class-b></converter></custom-converters></configuration><mapping map-id="k" type="bi-directional"><class-a>com.ddlab.dozer.type5.srcpkg.SrcBean</class-a><class-b>com.ddlab.dozer.type5.destnpkg.DestnBean</class-b><!-- For UUID --><field copy-by-reference="true"><a>idKey</a><b>uid</b></field><!-- For java.util.Date to org.joda.time.LocalDate --><field><a>utilDate</a><b>jodaDate</b></field><!-- For double to java.math.BigDecimal --><field><a>amount</a><b>bigDecimal</b></field></mapping></mappings>
推土机提供了一个名为“ org.dozer.CustomConverter ”的接口,该接口可根据我们的要求进行自定义转换。 我在下面提供了一个小代码段。
package com.ddlab.dozer.type5.converters;import org.dozer.CustomConverter;
import org.dozer.MappingException;
import org.joda.time.LocalDate;/*** The Class Date2JodaDateConverter is used as a Dozer custom converter for* converting java.util.Date to Jodatime LocalDate.* * @author <a href="mailto:debadatta.mishra@gmail.com">Debadatta Mishra</a>* @since 2013*/
public class Date2JodaDateConverter implements CustomConverter {/** (non-Javadoc)* * @see org.dozer.CustomConverter#convert(java.lang.Object,* java.lang.Object, java.lang.Class, java.lang.Class)*/@Overridepublic Object convert(Object existingDestinationFieldValue,Object sourceFieldValue,@SuppressWarnings("rawtypes") Class destinationClass,@SuppressWarnings("rawtypes") Class sourceClass) {if (sourceFieldValue == null) {return null;}if (sourceFieldValue instanceof java.util.Date) {java.util.Date utilDate = (java.util.Date) sourceFieldValue;LocalDate localDate = new LocalDate(utilDate.getTime());return localDate;}throw new MappingException("Misconfigured/unsupported mapping");}}
要了解更多信息,请参考以下软件包。
- com.ddlab.dozer.type5.converters
- com.ddlab.dozer.type5.destnpkg
- com.ddlab.dozer.type5.srcpkg
怎么做
要使用“ Dozer”框架,您必须在类路径中使用以下jar文件。
- commons-beanutils-1.7.jar
- commons-lang-2.4.jar
- commons-logging-1.1.1.jar
- commons-logging-api-1.1.1.jar
- 推土机5.3.2.jar
- joda-time-2.2.jar
- log4j-1.2.16.jar
- log4j-over-slf4j-1.6.1.jar
- slf4j-api-1.6.1.jar
- slf4j-jdk14-1.6.1.jar
- slf4j-simple-1.6.1.jar
您必须从以下链接下载“ Dozer”框架: http : //dozer.sourceforge.net/ 。 推土机还提供eclipse插件以简化映射工作。
相关软件包和配置文件
普通豆到普通豆
- com.ddlab.rnd.type1.destnpkg(来自src)
- com.ddlab.rnd.type1.srcpkg(来自src)
- com.ddlab.rnd.type1(来自测试)
- dozerMapping.xml(映射配置)
收藏集复制
- com.ddlab.dozer.type2.destnpkg(来自src)
- com.ddlab.dozer.type2.srcpkg(来自src)
- com.ddlab.dozer.type2(来自测试)
- list2ListMapping.xml(映射配置)
双向Bean复制
- com.ddlab.dozer.type3(来自测试)
- dozerBidirectionalMapping1.xml(映射配置)
扁到嵌套豆/嵌套到扁豆
- com.ddlab.dozer.type4.destnpkg(来自src)
- com.ddlab.dozer.type4.srcpkg(来自src)
- com.ddlab.dozer.type4(来自测试)
- flat2NestedBeanMapping.xml(映射配置)
- nestedBeanMapping2Flat.xml(映射配置)
定制转换器
- com.ddlab.dozer.type5.converters(来自src)
- com.ddlab.dozer.type5.destnpkg(来自src)
- com.ddlab.dozer.type5.srcpkg(来自src)
- com.ddlab.dozer.type5(来自测试)
- dozercustomconvertermapping.xml
下载
您可以从以下Dropbox网站下载完整的Eclipse项目: https : //www.dropbox.com/s/j6ep7wq7lalfe2k/dozerbeancopy.zip 。 您可以通过导入项目轻松地配置Eclipse IDE。
结论
希望您喜欢我关于在Java中使用Dozer框架进行bean复制的小型文章。 下载完整的项目并查看源代码,以了解概念及其用法。 根据复杂性和设计,您可以决定是否使用此概念。 对于任何类型的问题和错误,您可以通过debadatta.mishra@gmail.com与我联系。
资源和参考
还有其他框架可以或多或少地提供bean操作。 我发现“推土机”框架适用于各种领域。 还有一种类似的框架称为“ Nomin”,该框架通过在属性文件中提供配置来提供类似于“ Dozer”的映射。 我在下面提供了各种链接供您参考。
- http://dozer.sourceforge.net/documentation/gettingstarted.html
- http://nomin.sourceforge.net/
- http://modelmapper.org/
- http://code.google.com/p/orika/
- http://morph.sourceforge.net/
- https://code.google.com/p/omapper/
翻译自: https://www.javacodegeeks.com/2013/09/bean-manipulation-using-dozer-framework.html
dozer bean