使用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
總結
以上是生活随笔為你收集整理的使用Dozer框架进行Bean操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 蒙汉药是什么 蒙汉药介绍
- 下一篇: 爱的希望爱的回味是什么歌 爱的希望爱的回