1.Dozer的简单应用
分析多层架构的J2EE系统,经常存在JavaBean直接的拷贝。比如在DAO层,我们通过POJO取得业务层需要的数据,将这些数据传递给Service层的VO。POJO与VO就存在典型的值拷贝。还有就是Webservice,客户端调用Webservice,也存在将大量返回值映射到相应的JavaBean里。
典型的解决方案就是手动拷贝,弊端很明显,代码中充斥大量Set Get方法,真正的业务被埋藏于值的拷贝之中。另一种方案就是使用BeanUtils,但BeanUtils不够灵活,有时候不得不手动拷贝。
对于这种重复没有实际意义的拷贝的解决方案是 :Dozer 一把JavaBean利器
Dozer支持简单类型 复杂类型的双向递归映射。
如何使用呢? 类似BeanUtils 很简单,如果两个javaBean之间,属性名相同,类型为基本类型,那么下面代码就OK了,基本没有学习曲线。
Mapper mapper = new DozerBeanMapper();
DestinationObject destObject = mapper.map(sourceObject, DestinationObject.class);
or
DestinationObject destObject = new DestinationObject();
mapper.map(sourceObject, destObject);
2.Dozer的复杂应用
如何使用Dozer映射复杂类型,如:
1. 数据类型不一致。
2. 级联映射。
3. 自定义映射。
Dozer对于基本类型之间转换是不用配置的,比如Sting <------>Integer ,只要属性名称相同就Ok了。
而常用的Date与String映射配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<mappings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://dozer.sourceforge.net E:\dozer\dozer-5.0-src\dozer-5.0\src\site\resources\schema\beanmapping.xsd"
xmlns="http://dozer.sourceforge.net">
<mapping date-format="MM-dd-yyyy">
<class-a>net.blogjava.vincent.pojo.CustomerPo</class-a>
<class-b>net.blogjava.vincent.vo.CustomerVo</class-b>
<field>
<a>birthday</a>
<b>dateOfBirth</b>
</field>
</mapping>
指明 CustomerPo里面的birthday对应CustomerVo里面的dateOfBirth.并且是Date与String之间双向映射。
对于属性名称不一致,也仅仅需要一个配置文件,如下:
<?xml version="1.0" encoding="UTF-8"?>
<mappings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://dozer.sourceforge.net E:\dozer\dozer- 5.0-src\dozer-5.0\src\site\resources\schema\beanmapping.xsd"
xmlns="http://dozer.sourceforge.net">
<mapping>
<class-a>net.blogjava.vincent.pojo.CustomerPo</class-a>
<class-b>net.blogjava.vincent.vo.CustomerVo</class-b>
<field>
<a>type</a>
<b>transferType</b>
</field>
</mapping>
指明 CustomerPo里面的type 对应CustomerVo里面的transferType.
而对以级联,比如CustomerPo里面的一个属性映射为CustomerVo里么一个对象的属性,下面的配置就可以了
<mapping>
<class-a>net.blogjava.vincent.pojo.CustomerPo</class-a>
<class-b>net.blogjava.vincent.vo.CustomerVo</class-b>
<field>
<a>type</a>
<b>transferType.type</b>
</field>
</mapping>
上面其实就是Dozer基本用法,也涵盖了大多数应用场景,可见基本不需要写代码,仅仅一个配置文件搞定,简单吧。
而对于更个性化的映射,就需要写代码了, 比如在CustomerPo中的into类型的transferId ,映射CustomerVo String 类型transferType, 如果transferId =1 对应transferType=“immediateTranfer” 如果transferId =2 对应transferType=“scheduleTransfer” 反之亦然。就要写一个Customer的Map了, 如下:
import org.dozer.CustomConverter;
public class CustomerMap implements CustomConverter {
public Object convert(Object destinationFieldValue,
Object sourceFieldValue, Class<?> destinationClass,
Class<?> sourceClass) {
Object returnVale = null;
if(sourceFieldValue!=null){
if(sourceFieldValue instanceof Integer ){
if((Integer)sourceFieldValue == 1){
returnVale ="immediateTranfer";
}
if((Integer)sourceFieldValue == 2){
returnVale ="scheduleTransfer";
}
}
if(sourceFieldValue instanceof String ){
if("immediateTranfer".equals(destinationFieldValue)){
returnVale =1;
}
if("scheduleTransfer".equals(destinationFieldValue)){
returnVale =2;
}
}
}
return returnVale;
}
}
然后在配置文件配置就Ok了 如下:
<mapping>
<class-a>net.blogjava.vincent.pojo.CustomerPo</class-a>
<class-b>net.blogjava.vincent.vo.CustomerVo</class-b>
<field custom-converter="net.blogjava.vincent.mapUtil.CustomerMap">
<a>type</a>
<b>transferType</b>
</field>
</mapping>
下面就是一个完整的配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<mappings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://dozer.sourceforge.net E:\dozer\dozer-5.0-src\dozer-5.0\src\site\resources\schema\beanmapping.xsd"
xmlns="http://dozer.sourceforge.net">
<mapping date-format="yyyy-MM-dd">
<class-a>net.blogjava.vincent.pojo.UserInfo</class-a>
<class-b>net.blogjava.vincent.vo.UserInfoVo</class-b>
<field>
<a>colleage.name</a>
<b>schoolName</b>
</field>
</mapping>
<mapping>
<class-a>net.blogjava.vincent.pojo.CustomerPo</class-a>
<class-b>net.blogjava.vincent.vo.CustomerVo</class-b>
<field custom-converter="net.blogjava.vincent.mapUtil.CustomerMap">
<a>type</a>
<b>transferType</b>
</field>
</mapping>
</mappings>
分享到:
相关推荐
在实际应用中,有一些流行的开源库如Apache Commons BeanUtils、Dozer等提供了强大的对象映射功能,它们在一定程度上实现了自动封装的特性,可以作为开发自动封装javaBean工具类的参考。 自动封装javaBean的工具类...
除了框架内置的功能,还有一些第三方库可以帮助简化这个过程,如Dozer、ModelMapper等,它们提供了一种更直观的方式来映射对象之间的属性。 8. **单元测试**: 对于封装逻辑,编写单元测试是非常重要的,确保无论...
- 除了标准库,还有一些第三方库如Apache Commons BeanUtils、Dozer等提供了更便捷的对象映射功能,可以简化XML与JavaBean之间的转换。 在实际开发中,根据项目需求和性能考虑,可以选择合适的方法进行XML与...
3. **Dozer JavaBean转换**:Dozer是一个强大的Java对象到Java对象(O-O-Mapping)映射库。在数据转换过程中,Dozer可以帮助将一个对象模型转换为另一个,使得不同数据模型间的通信变得容易。这对于数据整合和跨系统...
8. **替代品和扩展**: 随着Java生态的发展,其他库如Dozer、ModelMapper等提供了更高级的属性映射和转换功能,但BeanUtils仍然因其简单易用和广泛支持而在许多项目中被使用。 通过下载并查看这个压缩包中的所有版本...