(转)对象转换利器之Dozer

标签: 对象 dozer | 发表时间:2015-02-28 14:10 | 作者:
出处:http://jackyrong.iteye.com
http://ningandjiao.iteye.com/blog/1989838

在Java的世界中,经常会涉及到需要在2个对象中进行转换,比如说:
调用SOAP Web服务,需要把自己的Domain对象转换为Soap服务的Jaxb对象请求,
在分层级SOA架构中,2个层级之间Domain对象的转换,
在分布式系统中,每个模块使用自己的领域对象,防止自己的业务被其他模块的domain对象影响

通常情况下,程序员们会自己弄一个Transformer层,来做对象之间的转换。估计很多同志在自己的项目代码中都可以看到Transformer的身影。但是,复杂的Java对象之间的转换并不是一个非常容易的问题,因为你需要不停的检测某个属性值是否为null,你需要做属性类型的转换,Date对应到String, String对应到Int等等。这就导致了Transformer的臃肿以及对程序员生产力的浪费。Dozer就是对懒(you)惰(xiu)程序员在这个问题上的通用解决方案。

Dozer是一个开源的,通用的,健壮的,灵活的,易于重用的,可配置的Java对象Mapping框架 。这个定义中的每一个形容词对程序员都非常亲切. (作者注: Dozer虽好,请不要贪恋, 因为任何对象之间的转换都会带来维护和性能的开销,能不做对象转换还是不要做了,跑不掉的时候,请选用Dozer)。

Dozer怎么用
使用Dozer的流程非常清楚:
配置你需要mapping的类,以及类之间的属性之间的对应关系。
根据你的配置初始化Mapper
使用mapper.map(source, target.class)获取转换后的对象。
Dozer提供了2种方式去配置需要mapping的类,一种是基于XML,一种是基于API,API的方式是5.3版本才开始提供的,主要是为了解决xml方式不可动态修改mapping配置的问题。下面来看一个最基础的使用Dozer的例子:

假设在一个系统中,模块A中客户的类型是User,而模块B中客户的类型是Customer, 现在模块B需要接受模块A中客户,并转换为自己模块的客户类型Customer。
Java代码  收藏代码
public class User { 
    private int userId; 
    private String  userName; 
 
    public User(int userId, String userName) { 
        this.userId = userId; 
        this.userName = userName; 
    } 
 
    public int getUserId() { 
        return userId; 
    } 
 
    public void setUserId(int userId) { 
        this.userId = userId; 
    } 
 
    public String getUserName() { 
        return userName; 
    } 
 
    public void setUserName(String userName) { 
        this.userName = userName; 
    } 

 
public class Customer { 
 
    private int customerId; 
    private String customerName; 
 
    public int getCustomerId() { 
        return customerId; 
    } 
 
    public String getCustomerName() { 
        return customerName; 
    } 
 
    public void setCustomerId(int customerId) { 
        this.customerId = customerId; 
    } 
 
    public void setCustomerName(String customerName) { 
        this.customerName = customerName; 
    } 


配置User和Customer属性的之间的对应关系
Java代码  收藏代码
<?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">dia 
    <mapping> 
        <class-a>com.xianlinbox.dozer.source.User</class-a> 
        <class-b>com.xianlinbox.dozer.destination.Customer</class-b> 
        <field> 
            <a>userId</a> 
            <b>customerId</b> 
        </field> 
        <field> 
            <a>userName</a> 
            <b>customerName</b> 
        </field> 
    </mapping> 
</mappings> 

调用Mapper获取转换后的对象:
Java代码  收藏代码
public class DozerMapperTest { 
    private DozerBeanMapper mapper; 
 
    @Before 
    public void setUp() throws Exception { 
        mapper = new DozerBeanMapper(); 
        mapper.setMappingFiles(Arrays.asList("dozer-bean-mappings.xml")); 
    } 
 
    @Test 
    public void testMapping() throws Exception { 
        User user = new User(1, "user1"); 
        Customer customer = mapper.map(user, Customer.class); 
        assertThat(customer.getCustomerId(),equalTo(1)); 
        assertThat(customer.getCustomerName(),equalTo("user1")); 
    } 



Dozer做对象转换有什么特点
默认属性Mapping,即如果属性名称一样, 就不需要显示配置,Dozer会自动处理。
自动做类型转换,即如果两个属性名称一样,即使类型不一样,在Dozer可理解范围内,帮你处理得妥妥的。Dozer可理解的类型范围非常广,这会极大的提升程序员的生产力
不必担心中间的null property,遇到null property,Dozer会把对应的所有属性全部设置为null,而不会抛NullPointerExeception。


Dozer可理解的类型转换有:
• Primitive to Primitive Wrapper
• 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 to Map
• Collection to Collection
• Collection to Array
• Map to Complex Type
• Map to Custom Map Type
• 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
• String to any of the supported Date/Calendar Objects.
• Objects containing a toString() method that produces a long representing time in (ms) to any supported Date/Calendar object.

Dozer官网地址:http://dozer.sourceforge.net/

已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [对象 dozer] 推荐:

(转)对象转换利器之Dozer

- - jackyrong
在Java的世界中,经常会涉及到需要在2个对象中进行转换,比如说:. 调用SOAP Web服务,需要把自己的Domain对象转换为Soap服务的Jaxb对象请求,. 在分层级SOA架构中,2个层级之间Domain对象的转换,. 在分布式系统中,每个模块使用自己的领域对象,防止自己的业务被其他模块的domain对象影响.

javascript对象转json

- - JavaScript - Web前端 - ITeye博客
把javascript对象转成json. 已有 0 人发表留言,猛击->> 这里<<-参与讨论. —软件人才免语言低担保 赴美带薪读研.

对象的消息模型

- loudly - 酷壳 - CoolShell.cn
[ ———— 感谢 Todd 同学 投递本文,原文链接 ———— ]. 话题从下面这段C++程序说起,你认为它可以顺利执行吗. 试试的确可以顺利运行输出hello world,奇怪吗. 其实并不奇怪,根据C++对象模型,类的非虚方法并不会存在于对象内存布局中,实际上编译器是把Hello方法转化成了类似这样的全局函数:.

jQuery的deferred对象详解

- 郑小东 - 阮一峰的网络日志
jQuery的开发速度很快,几乎每半年一个大版本,每两个月一个小版本. 今天我想介绍的,就是从jQuery 1.5.0版本开始引入的一个新功能----deferred对象. 这个功能很重要,未来将成为jQuery的核心方法,它彻底改变了如何在jQuery中使用ajax. 为了实现它,jQuery的全部ajax代码都被改写了.

我连对象都没有。。。

- 老五 - Lzhi&#39;s Views
两个黄鹂鸣翠柳,我连对象都没有. 劝君更尽一杯酒,我连对象都没有. 莫愁前路无知己,我连对象都没有. 借问酒家何处有,我连对象都没有. 停车坐爱枫林晚,我连对象都没有. 一枝红杏出墙来,我连对象都没有. 壮士一去不复还,我连对象都没有. 烈火焚烧浑不怕,我连对象都没有. 雌雄双兔奔地走,我连对象都没有.

js对象深拷贝

- - ITeye博客
在做一个前台页面你的时候用到了一个自己写的List对象,在进行深拷贝的时候参考了网上的代码:. //对象扩展,tObj被扩展对象,sObj扩展对象. Object.extend(a,b);//a获得了b的所有属性. 我自己定义的list中没有定义constructor,所以执行sObj.constructor == Array会报错,我就修改为:.

Java的对象驻留

- - Java译站
Java会将源代码中的字符串常量存储到常量池中. 这不只是说它俩的值是一样的,而是说就是同一个字符串对象. 用Java的话来说就是a==b的结果是true. 然而这个只对字符串以及小的整型或者长整型有效. 其它的对象是不会被驻留的,也就是说如果你创建了两个对象而他们的值是相等的,但他们并不是同一个对象.

方案对象管理

- - CSDN博客数据库推荐文章
方案是数据库用户拥有的数据库对象的集合,方案对象是直接引用数据库的逻辑结构,对象包括表、索引、序列、视图、同义词等结构.  这一章大部分内容,我们在SQL的第九章创建和管理表及约束和第十章其它常用对象都已讲过,做一些补充. 堆表就是普通表,也叫堆组织表. 之所以这样叫,是因为他使用数据结构中堆的算法来组织表.

jquery获取对象大全

- - CSDN博客Web前端推荐文章
1、JQuery的核心的一些方法 . $("Element").length; ‘元素的个数,是个属性 . $("Element").size(); ’也是元素的个数,不过带括号是个方法 . $("Element").get(); ‘某个元素在页面中的集合,以数组的形式存储 . $("Element").get(index); ’功能和上面的相同,index表示第几个元素,数组的下标 .

Hibrernate 数据对象状态

- - ITeye博客
Hibernate 中数据对象状态概念介绍. 一、 数据对象在Session中的状态:. 1、理解Session的缓存:Session接口是Hibernate向应用程序. 提供操作数据库的主要接口,它提供了基本的增、删、改、查 方法;. Session具有一个缓存,Hibernate的缓存包括Session的缓存和SessionFactory的缓存;.