dozer bean_使用Dozer框架进行Bean操作

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

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

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

相关文章

英语作文计算机主板,(完整版)电脑主板bios英文版的中英文对照翻译.pdf

电脑主板 BIOS 英文版的中英文对照翻译让你的电脑 BIOS 知识迅速提高滴。 Time/System Time时间 / 系统时间Date/System Date 日期/ 系统日期Level 2 Cache 二级缓存System Memory 系统内存Video Controller 视频控制器Panel Type 液晶屏型号Audio Controller 音频控制器Modem …

怎么修改提交git是的用户名_git 修改提交邮箱以及用户名-亲测

一.查看git配置$ git config --list 此命令会列出所有GIT当时能找到的配置...查看 列表项[email protected] 邮箱user.name123 用户名二.修改邮箱和用户名1.重新设置邮箱和用户名$ git config --global user.email"[email protected]&…

简而不漏,300字Java标识符命名规则规范,看一遍就可以记住,包名类名变量名常量名,让命名有迹可循

1.标识符命名规则 &#xff08;如果不遵循&#xff0c;编译不通过&#xff0c;需要严格遵守&#xff09; 由26个英文字母大小写&#xff0c;0-9&#xff0c;_&#xff0c;$组成不可以数字开头不可使用关键字和保留字&#xff0c;可以包含关键字和保留字严格区分大小写不能包含…

html文字依次显示,利用定时器和css3动画制作文字依次渐变显示的效果

如上图&#xff0c;这种效果看着是不是挺“柔”的附代码文字一次渐变出现body{background-color: #333333;padding: 20px;-webkit-box-sizing: border-box;-moz-box-sizing: border-box;box-sizing: border-box;}div,span{color: #ffffff;font-size: 30px;}.hidden{display: no…

面向Java程序员的20大Spring REST面试问题答案

大家好&#xff0c;过去两周来&#xff0c;我一直在与Spring教程共享一些REST&#xff0c;今天&#xff0c;我将向申请Web开发人员角色的Java开发人员共享一些常见的Spring和REST面试问题。 由于Spring Framework是用于开发Java Web应用程序和RESTful Web Services的最受欢迎的…

你还认识变量吗?Java基础学习不可略过的基本语法,简而不漏,变量的定义赋值和分类,系统认识Java中的变量有哪些?

文章目录变量的声明和赋值变量分类变量的声明和赋值 class VariableTest{public static void main(String[] args) {//变量的定义int myAge 21;//变量的使用System.out.println(myAge);//变量的声明int myNumber;//变量的赋值myNumber 9090;} }特别注意&#xff1a; ①定义变…

地图统计_庄园地图“出镜率”排名,500场数据统计,红教堂第一

在11赛季的时候很多玩家都私信趣游君&#xff0c;他们感觉自己排位经常会遇到一些让人讨厌的地图&#xff0c;也是因为经常遇到这些地图&#xff0c;所以导致自己的排位赛迟迟无法上分&#xff0c;因为要求我们做一下地图出镜率的排名。为了完成这个刷剧统计&#xff0c;趣游君…

2018安徽省计算机一级试题答案,2018年计算机等一级考试试题100题及参考答案.docx...

2018年计算机等一级考试试题100题及参考答案.docx文档编号&#xff1a;395397文档页数&#xff1a;14上传时间&#xff1a; 2018-09-03文档级别&#xff1a;精品资源文档类型&#xff1a;docx文档大小&#xff1a;28.84KB2018 年 计算机等一级考试试题 100 题 及参考答案 1. 在…

基于Spring Boot Profile的日志记录示例样本

我们希望在Spring Boot中为不同的配置文件使用不同的日志记录配置&#xff0c;例如在本地运行中&#xff0c;我们只希望控制台日志记录和用于生产&#xff0c;我们希望文件记录日志支持每天滚动日志文件。 我提出了一个示例logback配置&#xff0c;该配置将在所有应用程序中使…

简自动类型提升,精度损失类型强制转换,常用转义字符,简单帮你回顾Java基本数据类型整形浮点型字符型布尔型Boolean及其运算规则

文章目录整形浮点型字符型布尔型boolean自动类型提升强制类型转换注意整形 bit是计算机中的最小存储单位。 byte是计算机中的基本存储单元。 1MB1024KB——1KB1024B&#xff08;byte&#xff09; public class JavaTest {public static void main(String[] args) {byte b1 1…

linux posix 线程池_linux多线程--POSIX Threads Programming

linux多线程自己从接触很久也有不少实践&#xff0c;但总是觉得理解不够深刻&#xff0c;不够系统。借这篇文章试着再次系统学习一下linux多线程编程&#xff0c;理解编程的concept&#xff0c;细致看一下POSIX pthread API的实现。还是凭借强大的google search&#xff0c;找到…

计算机相关货品类别,工业计算机的种类以及产品供应链

(文章来源&#xff1a;OFweek)因为工业计算机几乎是针对某种特定需求而生&#xff0c;它的型态可说是五花八门&#xff0c;如果要简单做个分类&#xff0c;可以工业计算机的类型与层级来区分。大致上有板卡、子系统与系统整合解决方案三种。板卡&#xff1a;又有单板计算机(Sin…

Java基本语法(6)--算术运算符

除号&#xff08;/&#xff09;要注意的是除数与被除数的数据类型。如果都是整型&#xff0c;那么结果还是一个整型&#xff0c;因此结果相当于是取整&#xff1b;如果至少有一浮点型&#xff0c;那么结果是浮点型&#xff0c;也就可以除到完整彻底&#xff0c;带小数点的。 前…

soapui 证书_SoapUI入门之附件上传和配置Https请求

已经欠了一堆的作业了&#xff0c;吼吼~拖延症是个大bug&#xff0c;废话不多说&#xff0c;马上进入咱们SoapUI的学习中来吧~现在开始我们的SoapUI集成测试学习之道&#xff1a;一、如何使用SoapUI进行附件上传做人还是不能这样&#xff0c;这不欺负银嘛。首先&#xff0c;我们…

pptv手机端html,影视资源持续更新,PPTV手机化身看片神器

移动终端的快速发展为人们的生活带来了多元化的娱乐享受&#xff0c;用手机观赏电影逐渐成为人们放松身心的重要选择之一。虽然在手机品牌呈井喷发展的态势下&#xff0c;支持观影的智能手机不在少数&#xff0c;要想突出重围&#xff0c;仅仅在硬件配置上做文章是远远不够的&a…

Java基本语法(7)--赋值运算符及其扩展

int a1b11; int a12; //相当于a1a12 int a1-2; //相当于a1a1-2 //乘除取余均类似short s1 1; s1 2; //第一种 int s2 s1 2; //第二种 //以上两种都能实现2功能&#xff0c;但是第一种不会改变数据类型&#xff0c;更推荐。 int i1 1; i1 2.2; //i13int n 9; n (n) (n)…

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

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

计算机算法设计与分析考试题,《计算机算法设计与分析》习题及答案

《计算机算法设计与分析》习题及答案一&#xff0e;选择题1、二分搜索算法是利用( A )实现的算法。A、分治策略 B、动态规划法 C、贪心法 D、回溯法2、下列不是动态规划算法基本步骤的是( A )。A、找出最优解的性质 B、构造最优解 C、算出最优解 D、定义最优解3、最大效益优先是…

centos安装盘ntfs_在CentOS下挂载NTFS格式U盘的方法

由于ntfs是微软自己的文件格式&#xff0c;因此linux系统在挂载这类格式的时候需要多做点东西&#xff0c;CentOS也不例外。安装命令如下&#xff1a;wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.2-2.el5.rf.i386.rpmrpm -i rpmforge-release-0.5.2-2.e…

Java基本语法(8)--比较运算符

比较运算符的结果都是boolean型&#xff0c;也就是要么是true&#xff0c;要么是false。 注意 和 之分。