<link rel="stylesheet" href="https://js.how234.com/third-party/SyntaxHighlighter/shCoreDefault.css" type="text/css" /><script type="text/javascript" src="https://js.how234.com/third-party/SyntaxHighlighter/shCore.js"></script><script type="text/javascript"> SyntaxHighlighter.all(); </script>
什麼是dozer java,讓我們一起了解一下?
Dozer 是一個對象轉換工具。Dozer可以在JavaBean到JavaBean之間進行遞歸數據複製,並且這些JavaBean可以是不同的複雜的類型。所有的mapping,Dozer將會很直接的將名稱相同的fields進行復制,如果field名不同,或者有特別的對應要求,則可以在xml中進行定義。
為什麼要使用Dozer?
因為分析多層架構的J2EE系統,經常存在JavaBean直接的拷貝。比如我們在DAO層,通過Do取得業務層需要的數據,將這些數據傳遞給Service層的VO。Do與VO就存在典型的值拷貝。
典型的解決方案就是手動拷貝,代碼中充斥大量Set 和Get方法,真正的業務被埋藏值與值的拷貝之中。
另一種方案就是使用BeanUtil,但BeanUtil不夠很好的靈活性,又時候還不得不手動拷貝。Dozer可以靈活的對對象進行轉換,且使用簡單。
那麼如何讓Dozer自動完成User類到ApiUserDestination類的映射?
1、創建兩個 Java Bean 類:
public class User { private String name; private Integer age; private Date birthday; // 省略 setter 和 getter 方法}
public class UserApiDestinationObject { private String name; private String age; public String birthday;
// 重寫 toString 方法,方便測試 @Override public String toString() { return "UserApiDestinationObject{" + "name='" + name + ''' + ", age='" + age + ''' + ", birthday='" + birthday + ''' + '}'; } // 省略 getter、setter 方法}
2、測試:
@Testpublic void apiTest() { Mapper mapper = new DozerBeanMapper(); User user = new User(); user.setName("sid10t."); user.setAge(3); user.setBirthday(new Date()); UserApiDestinationObject destinationObject = mapper.map(user, UserApiDestinationObject.class); System.out.println(destinationObject);}
3、輸出:
UserApiDestinationObject{name='sid10t.', age='3', birthday='Tue Mar 08 10:56:02 CST 2022'}
此時,Dozer 自動完成 User 類到 ApiUserDestination 類的映射。這是 Dozer 的默認映射方式——隱式映射,Dozer 自動的將兩個實體類的相同屬性名的屬性進行映射。如果兩個屬性的屬性名相同,但是類型不同,Dozer 會按照默認的轉換規則進行類型的轉換,而且不同修飾符的屬性也能正常進行映射。