1 如何得到Dozer 工具類jar包
1.點選下載下傳:http://sourceforge.net/projects/dozer/files/
2.如果使用maven工具的話,在pom.Xml檔案中加入:
<dependency> <groupId>net.sf.dozer</groupId> <artifactId>dozer</artifactId> <version>5.2.1</version> </dependency> |
加入你的建構路徑既可以使用。
2 Dozer使用(不與spring內建下)
2.1 dozer使用分類
根據有無映射檔案和檔案的多少,有三種方式:
Mapper mapper = new DozerBeanMapper(); SourceObject sourceObject = new SourceObject(); DestinationObject destObject = (DestinationObject) mapper.map(sourceObject, DestinationObject.class); // or DestinationObject destObject = new DestinationObject(); mapper.map(sourceObject, destObject); List myMappingFiles = new ArrayList(); myMappingFiles.add("dozerBeanMapping.xml"); //myMappingFiles.add("someOtherDozerBeanMappings.xml"); DozerBeanMapper mapper = new DozerBeanMapper(); SourceObject sourceObject = new SourceObject(); mapper.setMappingFiles(myMappingFiles); DestinationObject stObject= (DestinationObject) mapper.map(sourceObject, DestinationObject.class); Mapper mapper = DozerBeanMapperSingletonWrapper.getInstance(); SourceObject sourceObject = new SourceObject(); DestinationObject destObject = (DestinationObject) mapper.map(sourceObject, DestinationObject.class); //or //Mapper mapper = DozerBeanMapperSingletonWrapper.getInstance(); //DestinationObject destObject = new DestinationObject(); mapper.map(sourceObject, destObject); |
2.2 舉例說明:
假設我們現在有一個userDo類,如下:
package ce.dozer; publicclass User { privateintid; private String name; private String password; private Info info; publicint getId() { returnid; } publicvoid setId(int id) { this.id = id; } public String getName() { returnname; } publicvoid setName(String name) { this.name = name; } public String getPassword() { returnpassword; } publicvoid setPassword(String password) { this.password = password; } public Info getInfo() { returninfo; } publicvoid setInfo(Info info) { this.info = info; } } |
一個userVo類,如下:
package ce.dozer; publicclass UserVO { privateintid; private String userName; private String password; private InfoVO info; publicint getId() { returnid; } publicvoid setId(int id) { this.id = id; } public String getUserName() { returnuserName; } publicvoid setUserName(String userName) { this.userName = userName; } public String getPassword() { returnpassword; } publicvoid setPassword(String password) { this.password = password; } public InfoVO getInfo() { returninfo; } publicvoid setInfo(InfoVO info) { this.info = info; } } |
一個性別枚舉類,如下:
package ce.dozer; publicenum GenderType { male,//男 female//女 } |
一個infoDo類,如下:
package ce.dozer; import java.util.Date; publicclass Info { privateintid; private Date createDate; private GenderType gender; publicint getId() { returnid; } publicvoid setId(int id) { this.id = id; } public Date getCreateDate() { returncreateDate; } publicvoid setCreateDate(Date createDate) { this.createDate = createDate; } public GenderType getGender() { returngender; } publicvoid setGender(GenderType gender) { this.gender = gender; } } |
一個infoVo類,如下:
package ce.dozer; publicclass InfoVO { privateintid; private String date; private Integer gender; publicint getId() { returnid; } publicvoid setId(int id) { this.id = id; } public String getDate() { return date; } publicvoid setDate(String date) { this.date = date; } public Integer getGender() { returngender; } publicvoid setGender(Integer gender) { this.gender = gender; } } |
在給出的示例中我們可以看到userDo與userVo 中的字段對應關系
userVo | userDo | 不同 |
id(int) | id(int) | |
userName(String) | name(String) | 名稱不同 |
password(String) | password(String) | |
Info(InfoVo) | info (Info) | 類型不同 |
再看看infoDo與 infoVo 中的字段對應關系
infoVo | infoDo | 不同 |
id(int) | Id(int) | |
createDate(String) | date(Date) | 類型不同 |
gender(Integer) | Gender(GenderType)枚舉 | 類型不同 |
綜合上面的問題我們可以如下解決方式:
(1)字段名稱不同映射配置
<mapping> <class-a>ce.dozer.User</class-a> <class-b>ce.dozer.UserVO</class-b> <field> <a>name</a> <b>userName</b> </field> </mapping> |
(2)Date與String映射配置如下:
<mapping date-format="yyyy-MM-dd"> <class-a>ce.dozer.User</class-a> <class-b>ce.dozer.UserVO</class-b> <field> <a>info.createDate</a> <b>info.date</b> </field> </mapping> |
(3)自己編寫一個類來處理枚舉與Integer的轉換(假設為util.EnumIntConverter),配置如下:
<configuration> <stop-on-errors>true</stop-on-errors> <date-format>yyyy-MM-dd</date-format> <wildcard>true</wildcard> <custom-converters> <converter type="util.EnumIntConverter"> <class-a>java.lang.Enum</class-a> <class-b>java.lang.Integer</class-b> </converter> </custom-converters> </configuration> <mapping> <class-a>ce.dozer.User</class-a> <class-b>ce.dozer.UserVO</class-b> <field> <a>info.gender</a> <b>info.gender</b> </field> </mapping> |
最終的dozerBeanMapping.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"> <configuration> <stop-on-errors>true</stop-on-errors> <date-format>yyyy-MM-dd</date-format> <wildcard>true</wildcard> <custom-converters> <converter type=" util.EnumIntConverter"> <class-a>java.lang.Enum</class-a> <class-b>java.lang.Integer</class-b> </converter> </custom-converters> </configuration> <mapping date-format="yyyy-MM-dd"> <class-a>ce.dozer.User</class-a> <class-b>ce.dozer.UserVO</class-b> <field> <a>info.createDate</a> <b>info.date</b> </field> <field> <a>info.gender</a> <b>info.gender</b> </field> <field> <a>info.createDate</a> <b>info.date</b> </field> <field> <a>name</a> <b>userName</b> </field> </mapping> </mappings> |
3 與spring的內建
3.1 1、dozer 要與spring內建需要将dozer交給spring管理,配置如下:
spring-dozer.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd" default-autowire="byName" default-lazy-init="false"> <bean id="mapper" class="org.dozer.spring.DozerBeanMapperFactoryBean"> <property name="mappingFiles"> <list> <value>classpath*:dozer-config/dozerBeanMapping.xml</value> </list> </property> </bean> </beans> |
3.2 2、當我們的dozer交給了spring管理,當spring容器啟動後我們可以将下面的代碼添加到用于繼承的基類中去:
private Mapper mapper ; public Mapper getMapper() { returnmapper; } publicvoid setMapper(Mapper mapper) { this.mapper = mapper; } |
3.3 3、在繼承者類中就可以直接如下使用:
getMapper().map(sourceObject, DestinationObject.class) |