使用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。 称为“推土机”的框架非常流行,可以灵活地在应用程序中使用和集成。 您可以在各种互联网站点上找到有关推土机的更多文档。 在这篇文章中,我将为您提供推土机的非常基础和实际的用法。

在以下情况下,让我们快速学习推土机的用法。

  • 将源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>

Dozer提供了一个名为“ 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)
	 */
	@Override
	public 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”的映射。 我在下面提供了各种链接供您参考。

翻译自: https://www.javacodegeeks.com/2013/09/bean-manipulation-using-dozer-framework.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值