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

dozer bean_使用Dozer框架进行Bean操作相关推荐

  1. 使用Dozer框架进行Bean操作

    介绍 如您所知,您可以在任何操作系统中将文件或文件夹从源位置复制到目标位置. 您是否考虑过复制基本上是POJO的java对象? 在许多情况下,您需要将源bean的内容复制到目标bean. 我不关心对象 ...

  2. MV* 框架 与 DOM操作为主 JS库 的案例对比

    最近分别使用 Zepto 和 Avalon框架写了个 SPA项目,贴出来讨论下 JS DOM操作为主 JS库 与 MV* 框架的对比 案例(MV* 框架 与 DOM操作 JS库 实例对比) 购物车页面 ...

  3. flask mysql项目模板渲染_Flask框架模板渲染操作简单示例

    本文实例讲述了Flask框架模板渲染操作.分享给大家供大家参考,具体如下: from flask import render_template from flask import Flask from ...

  4. thinkphp mysql cache_thinkPHP5框架数据库连贯操作之cache()用法分析

    本文实例讲述了thinkPHP5框架数据库连贯操作之cache()用法.分享给大家供大家参考,具体如下: 介绍 TP5中自带的缓存系统,是File型缓存.也就是文件型缓存.存储地址是:根目录..unt ...

  5. java 自动装载_java_详解Java的Spring框架下bean的自动装载方式,Spring容器可以自动装配相互协 - phpStudy...

    详解Java的Spring框架下bean的自动装载方式 Spring容器可以自动装配相互协作bean之间的关系,这有助于减少对XML配置,而无需编写一个大的基于Spring应用程序的较多的和元素. 自 ...

  6. tp5 日期范围查询_tp5(thinkPHP5框架)时间查询操作实例分析

    本文实例讲述了tp5(thinkPHP5框架)时间查询操作.分享给大家供大家参考,具体如下: 在项目中 可能会遇到 跨月份进行查询 比如在 当输入201809 会获取当月的开始时间$start_mon ...

  7. Mybatis框架实现CRUD操作

    Mybatis框架实现CRUD操作 自定义mybatis流程 mybatis基于代理dao的CRUD操作(重点) E:\JAVAworkspace\mybatis_CRUD CRUD中可能遇到的问题: ...

  8. java dozer 官网,Dozer数据对象转换神器

    首先,为什么要进行数据转换? 在一个分层的体系结构中,经常会使用DTO.PO.VO等封装数据,封装数据到特定的数据对象中,然而在很多情况下,某层内部的数据是不允许传递到其它层,不允许对外暴露的,特别是 ...

  9. tp5 日期范围查询_tp5(thinkPHP5框架)时间查询操作实例分析,tp5thinkphp5

    tp5(thinkPHP5框架)时间查询操作实例分析,tp5thinkphp5 本文实例讲述了tp5(thinkPHP5框架)时间查询操作.分享给大家供大家参考,具体如下: 在项目中 可能会遇到 跨月 ...

最新文章

  1. 多线程共享内存的问题
  2. 使用Docker for Windows初体验
  3. keepalive之LVS-DR架构
  4. c语言中二叉树中总结点,C语言二叉树的三种遍历方式的实现及原理
  5. oracle用EXPLAIN PLAN 分析SQL语句
  6. react钩子_迷上了钩子:如何使用React的useReducer()
  7. 前端埋点的缺点_【埋点学习埋点质量】埋点的框架设计及其准确性
  8. 小程序源码 租房管理系统_租房小程序解决方案
  9. 刚来公司时我却做了一件最傻的事
  10. 网管学习日记-STP
  11. maven 构建spring boot + mysql 的基础项目
  12. opencv 快速简单二值化的做法
  13. java标准化考试系统源码_java标准化考试系统
  14. STC15单片机-低功耗设计
  15. macbook键盘失灵_如何使用MacBook的键盘在所有设备上键入
  16. 奇葩!小米手机自带浏览器css兼容问题,强制屏蔽、隐藏类名为 top_box 的元素。
  17. 大面积无线网络覆盖5大方案,满足不同场所的实际需求
  18. JAVA组合框怎么添加加减乘除,[C#]组合框设计windows加减乘除简单计算器应用
  19. spark driver HA
  20. 从股票市场选择配对的股票:共同趋势模型与套利定价理论

热门文章

  1. Sentinel(十三)之动态规则扩展
  2. 通俗易懂,常用线程池执行的-流程图
  3. JavaFX官方教程(十二)之树动画示例
  4. Java和Android中的注解
  5. 一百馒头一百僧,大僧三个更无争,小僧三人分一个大小和尚得几丁?
  6. 使用枚举定义常量更好点儿
  7. sam+matlab,Sam版Matlab粒子群PSO工具已经更新
  8. mysql unique count_MySQL - Count Number of Unique Values
  9. controller属于哪一层_别急着换5G,4G手机同样值得考虑!哪几款安卓手机称得上4G机皇?...
  10. tomcat(18)部署器