对象转换利器之Dozer
什么是Dozer
Dozer是一個Java對象轉換工具,可以在JavaBean和JavaBean之間進行遞歸數據復制,并且適應不同復雜的類型。Dozer會直接將名稱相同的屬性進行復制,屬性名不同或者有特殊的要求則可以在xml中進行配置。
除了使用Dozer,當然你還由其他選擇:
典型的解決方案就是手動拷貝,弊端很明顯,代碼中充斥大量Set 和Get方法,真正的業務被埋藏值與值的拷貝之中。
另一種方案就是使用BeanUtil,但BeanUtil不夠很好的靈活性,有時候還不得不手動拷貝。Dozer可以靈活的對對象進行轉換,且使用簡單。
Dozer做對象轉換有什么特點
默認屬性Mapping,即如果屬性名稱一樣, 就不需要顯示配置,Dozer會自動處理。
自動做類型轉換,即如果兩個屬性名稱一樣,即使類型不一樣,在Dozer可理解范圍內,幫你處理得妥妥的。Dozer可理解的類型范圍非常廣,這會極大的提升程序員的生產力
不必擔心中間的null property,遇到null property,Dozer會把對應的所有屬性全部設置為null,而不會拋NullPointerExeception。
Dozer可以自動做數據類型轉換。當前,Dozer支持以下數據類型轉換(都是雙向的)(注:Primitive基本數據類型 , 后面帶Wrapper是包裝類,Complex Type是復雜類型。):
• Primitive to Primitive Wrapper
原型(int、long等)和原型包裝類(Integer、Long) • Primitive to Custom Wrapper
原型和定制的包裝 • Primitive Wrapper to Primitive Wrapper
原型包裝類和包裝類 • Primitive to Primitive
原型和原型 • Complex Type to Complex Type
復雜類型和復雜類型 • String to Primitive
字符串和原型 • String to Primitive Wrapper
字符串和原型包裝類 • String to Complex Type if the Complex Type contains a String constructor
字符串和有字符串構造器的復雜類型(類) • String 到復雜類型 , 如果復雜類型包含一個 String 類型的構造器 • String to Map
字符串和Map • Collection to Collection
集合和集合 • Collection to Array
集合和數組 • Map to Complex Type
Map和復雜類型 • Map to Custom Map Type
Map和定制Map類型 • Enum to Enum
枚舉和枚舉 • Each of these can be mapped to one another: java.util.Date, java.sql.Date, java.sql.Time, java.sql.Timestamp, java.util.Calendar, java.util.GregorianCalendar
這些時間相關的常見類可以互換:java.util.Date, java.sql.Date, java.sql.Time, java.sql.Timestamp, java.util.Calendar, java.util.GregorianCalendar • String to any of the supported Date/Calendar Objects.
字符串和支持Date/Calendar的對象 • Objects containing a toString() method that produces a long representing time in (ms) to any supported Date/Calendar object.
如果一個對象的toString()方法返回的是一個代表long型的時間數值(單位:ms),就可以和任何支持Date/Calendar的對象轉換。
在普通Java項目中使用Dozer
在pom.xml中增加依賴
<dependency> <groupId>net.sf.dozer</groupId> <artifactId>dozer</artifactId> <version>5.5.1</version> </dependency>
使用Dozer進行類轉換
public class Main {
public static void main(String[] args) {
DozerBeanMapper mapper = new DozerBeanMapper();
UserDO userDO = new UserDO();
userDO.setName("hollis");
userDO.setAddress("hz");
userDO.setAge(25);
userDO.setCompanyId(1);
userDO.setBirthday(new Date());
userDO.setGender("male");
userDO.setEducation("1");
userDO.setNickName("hollis");
userDO.setPoliticalStatus("3");
UserVO userVO = (UserVO) mapper.map(userDO, UserVO.class);
System.out.println(userVO);
}
}
特殊的字段轉換
在使用mapper進行轉換前,設置一個或多個mapping文件
List myMappingFiles = new ArrayList();
myMappingFiles.add("dozer-mapping.xml");
mapper.setMappingFiles(myMappingFiles);
配置dozer-mapping.xml文件
數據類型不一致,或者名稱不相同或者有級聯關系等情況下,可以通過文件dozer-mapping.xml來進行定制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>
<class-a>com.hollis.lab.UserDO</class-a>
<class-b>com.hollis.lab.UserVO</class-b>
</mapping>
</mappings>
在JavaWeb項目中使用Dozer
在pom.xml中增加依賴
<dependency> <groupId>net.sf.dozer</groupId> <artifactId>dozer</artifactId> <version>5.5.1</version> </dependency>
使用Spring集成dozer
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="baseMapper" class="org.dozer.spring.DozerBeanMapperFactoryBean">
<property name="mappingFiles">
<list>
<value>classpath:mapping/dozer-mapping.xml</value>
</list>
</property>
</bean>
</beans>
使用baseMapper進行Bean的轉換
@Autowired
private Mapper baseMapper;
private UserVO doToVo(UserDO userDO){
if(userDO == null) return null;
UserVO vo = baseMapper.map(userDO, UserVO.getClass());
if(userDO.getCompanyId != null) getCompany(vo);
return vo;
}
通過以上的代碼加配置,我們就實現了從DO轉換到VO的部分操作,之所以說是部分操作,是因為我們在dozer-mapping.xml并沒有做多余的配置,只是使用dozer將DO中和VO中共有的屬性轉換了過來。對于其他的類型不同或者名稱不同等的轉換可以參考官網例子通過設置dozer-mapping.xml文件來實現。
上面還有一個getCompany()沒有實現。這個方法其實就是通過companyId查詢出company實體然后在賦值給UserVO中的company屬性。
注意事項
1:
DestinationObject destObject = mapper.map(sourceObject, DestinationObject.class);
DestinationObject必須有無參構造方法,不然會報java.lang.NoSuchMethodException: com.net.vo.CompanyVo.<init>()錯誤。
2:
SourceObject和DestinationObject中屬性必須可讀寫,比如提供公開的get或set方法,不然無法復制數據。其實,轉化的過程是通過調用UserDO中的getter方法和UserVO中的setter方法來實現的。
3:
dozer正常輸出日志需要增加兩個jar包
slf4j-api和slf4j-simple,或者,slf4j-api和slf4j-log4j12
例如:
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.6.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-simple -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.6.1</version>
</dependency>
參考資料
使用Dozer優雅的將DO轉換成VO:http://www.hollischuang.com/archives/1613
Dozer使用簡記:http://tedhacker.top/2016/08/17/Dozer%E4%BD%BF%E7%94%A8%E7%AE%80%E8%AE%B0/
Dozer 使用小結:https://www.jianshu.com/p/bf8f0e8aee23
總結
以上是生活随笔為你收集整理的对象转换利器之Dozer的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一万块钱买基金一月能挣多少 不同基金类
- 下一篇: MTCNN