使用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)*/@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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/367620.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

js如何把ajax获取的值返回到上层函数里?

我现在有个系统在用户点击浏览时&#xff0c;系统会以ajax的方式从后台获取查看的链接&#xff0c;并以window.open的方式打开&#xff0c;但因为现在多数的浏览器都会拦截window.open打开的地址&#xff0c;而window.location.href的方式又无法在浏览器新窗口打开&#xff0c;…

接口IDisposable的用法

C#的每一个类型都代表一种资源&#xff0c;而资源又分为两类&#xff1a; 托管资源 由CLR管理分配和释放的资源&#xff0c;即从CLR里new出来的对象。非托管资源 不受CLR管理的对象&#xff0c;如Windows内核对象&#xff0c;或者文件、数据库连接、套接字、COM对象等。如果类…

图形处理:betweeness中心性– neo4j的密码与graphstream

上周&#xff0c; 我写了关于中间性中心性算法以及使用graphstream 理解它的尝试 &#xff0c;在阅读源代码时&#xff0c;我意识到我可以使用neo4j的所有最短路径算法将某些东西放在一起。 概括地说&#xff0c;中间性中心度算法用于确定图中节点的负载和重要性。 在与Jen讨…

java tongpaiyu danliantiao_java版的汉字转拼音程序

[文件] ChiToLetter.javaimport java.io.UnsupportedEncodingException;import java.util.HashSet;import java.util.Iterator;import java.util.Set;import java.util.Vector;//实现汉字向拼音的转化//-----------------------------------------------------设计人:牛文平// …

小程序之Tab切换

小程序越来越火了&#xff0c;作为一名&#xff0c;额 有理想的攻城狮&#xff0c;当然要紧跟互联网时代的步伐啦&#xff0c;于是我赶紧抽时间学习了一下小程序的开发&#xff0c;顺便把经验分享给大家。 对于申请账号以及安装开发工具等&#xff0c;大家可以看官网&#xff…

configparser logging

configparser模块 # 该模块适用于配置文件的格式与windows ini文件类似&#xff0c;可以包含一个或多个节&#xff08;section&#xff09;&#xff0c;每个节可以有多个参数&#xff08;键值&#xff09;。 import configparser config configparser.ConfigParser() c…

JS结合Cookie实现验证码功能

验证码功能是现在网站开发中非常常见的一种功能&#xff0c;常见的编程语言&#xff0c;比如.NET,JAVA都能很容易实现验证码功能&#xff0c;今天我准备分享一个使用JS实现验证码的功能&#xff0c;非常简单使用&#xff0c;拿来就可以用&#xff0c;废话不多说&#xff0c;直接…

创建基于密码的加密密钥

本文讨论了创建基于密码的加密PBE密钥。 首先提醒您以前的要点–通常&#xff0c;在实际操作中&#xff0c;应将PBE密钥用作主密钥&#xff0c;该主密钥仅用于解锁工作密钥。 这具有三个主要优点&#xff1a; 您可以有多个密码&#xff0c;例如&#xff0c;托管的恢复密钥&am…

php-5.6.26源代码 - PHP文件汇编成opcode、执行

文件 php-5.6.26/Zend/zend.c ZEND_API int zend_execute_scripts(int type TSRMLS_DC, zval **retval, int file_count, ...) /* {{{ */ {va_list files;int i;zend_file_handle *file_handle;zend_op_array *orig_op_array EG(active_op_array); // 保存现场&#xff0c;操作…

java1a2b3c4d5e6f_用两个线程,一个输出字母,一个输出数字,交替输出1A2B3C4D...26Z...

用两个线程&#xff0c;一个输出字母&#xff0c;一个输出数字&#xff0c;交替输出1A2B3C4D...26Z方法一public class Test {static Thread t1 null, t2 null;public static void main(String[] args) {char[] aI "1234567".toCharArray();char[] aC "ABCD…

js如何设置浏览器全屏效果?

现在很多网页游戏进入游戏界面后都是全屏显示的效果&#xff0c;很多人问我这个要怎么实现&#xff0c;其实这个只要调用Fullscreen API就可以实现了作为一个比较新的 API&#xff0c;目前只有 Safari、Chrome 和 FireFox以及IE10以上的浏览器才支持该特性。因为尚未发布正式版…

6759: 异或序列

6759: 异或序列 时间限制: 1 Sec 内存限制: 128 MB题目描述 已知一个长度为n的整数数列a1,a2,…,an&#xff0c;给定查询参数l、r&#xff0c;问在al,al1,…,ar区间内&#xff0c;有多少子序列满足异或和等于k。也就是说&#xff0c;对于所有的x,y(l≤x≤y≤r)&#xff0c;满足…

Neo4j Java REST绑定–第2部分(批处理)

在第1部分中 &#xff0c;我们讨论了使用Java REST绑定建立与Neo4j Server的连接。 现在让我们详细了解事务&#xff0c;批处理以及REST请求的实际情况。确保org.neo4j.rest.logging_filter to true) as described in Part 1打开日志记录&#xff08;将系统属性org.neo4j.rest.…

selector简介

最近在学习java NIO&#xff0c;发现java nio selector 相对 channel ,buffer 这两个概念是比较难理解的 ,把学习理解的东西以文字的东西记录下来&#xff0c;就像从内存落地到硬盘&#xff0c;把内存中内容换成该知识点的索引。 在介绍Selector之前先明确以下3个问题&#…

java随机数排序算法_理解快速排序算法

快速排序在平均状况下&#xff0c;排序n个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n^2)次比较&#xff0c;但这种状况并不常见。事实上&#xff0c;快速排序通常明显比 其他Ο(n log n)算法更快&#xff0c;因为它的内部循环(inner loop)可以在大部分的架构上很有效率地…

开课吧视频内容汇总

1. 前端读取文件内容&#xff0c; FileReader对象 2. 用户联网状态 3. application/x-www-form-urlencoded 参数序列化 &#xff08;具体借鉴jquery的$.param方法&#xff09;&#xff0c;后端接收到的数据格式是 a[0][a] 1,并不会将其整理成对象或者数组 var nextStr ;funct…

PhantomJS宣布终止开发

由于没有人贡献代码&#xff0c;我很快就要把这个项目归档了。也许未来的某一天&#xff0c;我又想开发了&#xff0c;还会重新启动起来。既然决定停止开发了&#xff0c;那么自然地&#xff0c;PhantomJS 2.5 和原定的 PhantomJS2.1.x 就告吹了。对应的&#xff0c;这两个版本…

Servlet和JSP中的文件上传示例

使用Servlet和JSP将文件上传到服务器是Java Web应用程序中的常见任务。 在对Servlet或JSP进行编码以处理文件上传请求之前&#xff0c;您需要了解一点有关HTML和HTTP协议中文件上传支持的知识。 如果要让用户从文件系统中选择文件并上传到服务器&#xff0c;则需要使用<inpu…

20165312-第4周-课上内容补做以及知识点总结

20165312-第4周-课上内容补做以及知识点总结 1、课上内容补做 教材代码完成情况测试p45这题很快就做完了&#xff0c;然后忘记提交了。。就开始做递归。想起来的时候已经过了时间。 public class Example3_7 {public static void main(String args[]) {int sum0,i,j;for(i1;i&l…

java入门就是死敲代码吗_JAVA入门第二季综合练习(直接思考敲的代码,面向过程,不好)...

package com.imocc;/*author ndh2016年3月27日 21:03:02*/import java.util.Scanner;public class DiDi {public static void main(String[] args){Scanner sc new Scanner(System.in);System.out.println("欢迎使用迪迪租车系统&#xff01;");System.out.println(…