对象转换利器之Dozer

在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代码  

  1. public class User {
  2. private int userId;
  3. private String  userName;
  4. public User(int userId, String userName) {
  5. this.userId = userId;
  6. this.userName = userName;
  7. }
  8. public int getUserId() {
  9. return userId;
  10. }
  11. public void setUserId(int userId) {
  12. this.userId = userId;
  13. }
  14. public String getUserName() {
  15. return userName;
  16. }
  17. public void setUserName(String userName) {
  18. this.userName = userName;
  19. }
  20. }
  21. public class Customer {
  22. private int customerId;
  23. private String customerName;
  24. public int getCustomerId() {
  25. return customerId;
  26. }
  27. public String getCustomerName() {
  28. return customerName;
  29. }
  30. public void setCustomerId(int customerId) {
  31. this.customerId = customerId;
  32. }
  33. public void setCustomerName(String customerName) {
  34. this.customerName = customerName;
  35. }
  36. }

配置User和Customer属性的之间的对应关系

Java代码  

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <mappings xmlns="http://dozer.sourceforge.net"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://dozer.sourceforge.net
  5. http://dozer.sourceforge.net/schema/beanmapping.xsd">dia
  6. <mapping>
  7. <class-a>com.xianlinbox.dozer.source.User</class-a>
  8. <class-b>com.xianlinbox.dozer.destination.Customer</class-b>
  9. <field>
  10. <a>userId</a>
  11. <b>customerId</b>
  12. </field>
  13. <field>
  14. <a>userName</a>
  15. <b>customerName</b>
  16. </field>
  17. </mapping>
  18. </mappings>

调用Mapper获取转换后的对象:

Java代码  

  1. public class DozerMapperTest {
  2. private DozerBeanMapper mapper;
  3. @Before
  4. public void setUp() throws Exception {
  5. mapper = new DozerBeanMapper();
  6. mapper.setMappingFiles(Arrays.asList("dozer-bean-mappings.xml"));
  7. }
  8. @Test
  9. public void testMapping() throws Exception {
  10. User user = new User(1, "user1");
  11. Customer customer = mapper.map(user, Customer.class);
  12. assertThat(customer.getCustomerId(),equalTo(1));
  13. assertThat(customer.getCustomerName(),equalTo("user1"));
  14. }
  15. }

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/

转至:http://ningandjiao.iteye.com/blog/1989838

时间: 2024-10-24 08:40:21

对象转换利器之Dozer的相关文章

后台任务利器之Hangfire

后台任务利器之Hangfire 一.简述 Hangfire作为一款高人气且容易上手的分布式后台执行服务,支持多种数据库.在.net core的环境中,由Core自带的DI管理着生命周期,免去了在NF4.X环境中配置always running的麻烦,真正做到开箱即用. 二.安装 Hangfie官方支持是MsSql和redis,除此之外,可供选择的还有PostgreSql和Mongo.在应用入口项目需要引用Hangfire.AspNetCore和特定持久库,比如使用了MsSql数据库的Hangfi

C++习题 对象转换

[Submit][Status][Web Board] Description 定义一个Teacher(教师)类(教师号,姓名,性别,薪金)和一个Student(学生)类(学号,姓名,性别,成绩),二者有一部分数据成员是相同的,num(号码),name(姓名),sex(性别).编写程序,将一个Student对象(学生)转换为Teacher(教师)类,只将以上3个相同的数据成员移植过去.可以设想为: 一位学生大学毕业了,留校担任教师,他原有的部分数据对现在的教师身份来说仍然是有用的,应当保留并成为

(精华)将json数组和对象转换成List和Map(小龙哥和牛徳鹤的对话)

将java标准的数据结构ArrayList和HashMap转换成json对象和数组很简单 只需要JSONArray.fromObject(obj);或者JSONObject.fromObject(obj); 将json对象转换成Map(必须用到遍历) public static void main(String[] args){ HashMap<String, Object> map = new HashMap<String, Object>(); map.put("na

对象转换处理

#region 对象转换处理 2 /// <summary> 3 /// 判断对象是否为Int32类型的数字 4 /// </summary> 5 /// <param name="Expression"></param> 6 /// <returns></returns> 7 public static bool IsNumeric(object expression) 8 { 9 if (expression

JSON对象转换成JSON字符串

1.问题背景 有一个json对象,需要将其转换成json字符串 JSON.stringify(obj) 2.实现源码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtm

将Model对象转换成json文本或者json二进制文件

https://github.com/casatwy/AnyJson 注意:经过测试,不能够直接处理字典或者数组 主要源码的注释 AJTransformer.h 与 AJTransformer.m // // AJTransformer.h // AnyJson // // Created by casa on 14-9-19. // Copyright (c) 2014年 casa. All rights reserved. // #import <Foundation/Foundation.

[转]Json转换神器之Google Gson的使用

这几天,因为项目的需要,接触了Google的Gson库,发现这个东西很好用,遂记下简单的笔记,供以后参考.至于Gson是干什么的,有什么优点,请各位同学自行百度.话不多说,切入正题: 1. 下载Gson的jar包,拷贝到项目的lib文件夹中,并将其加入到buildPath中.使用maven的同学,直接在pom中加入以下依赖即可: ? 1 2 3 4 5 <dependency> <groupId>com.google.code.gson</groupId> <ar

Android UI开发神兵利器之Angrytools

最近很多人在问我,个人App开发者如何去设计UI. 其实这是个人开发者最头痛的问题,搞技术的人,确实没法做到面面俱到,不可能花大量的时间去切图,去做原型设计,去做美工. 当然,虽然我们设计不出那么复杂,精巧的UI,但是简单的东西,我们在没有美工的基础上,通过一些手段,也是可以做的不错的,从本文开始,我们将介绍一些关于Android界面开发的神兵利器,正是这些大神们开发的工具,让Coder也能做出一些不是那么见不得人的设计. Angrytools,我们今天的主角,我想当初作者也是被UI弄的Angr

Linux菜鸟升级利器之ansible

一.absible是什么? ansible是一款简单的.开源的自动化管理工具.它通过Openssh工作,没有服务器:并且被管理的客户端上面并不需要安装什么客户端软件或启动什么守护进程,没有客户端:扩展模块可以使用任何语言编写:命令自动传输到管理机执行,并返回结果: 二.安装ansible 安装ansible需要使用Fedora的EPEL源,所以要先配置好yum的epel源,在yum源文件中添加: [base1] name=epel baseurl=http://dl.fedoraproject.