JavaBean之间拷贝利器-Dozer 映射数据类型不一致,级联映射与自定义映射

F5 GTM DNS 实战指南:智能DNS的监控与健康检查机制 本文深入解析F5 BIG-IP GTM智能DNS的核心机制,重点阐述其监控与探针两大功能如何协同工作。监控器负责深度检查服务器应用健康,确保服务可用性;探针则实时测量网络路径质量,实现基于延迟的智能流量调度。文章通过实战配置步骤,指导如何构建逻辑架构、建立iQuery通信、配置业务级健康检查及探针,从而构建高可用、高性能的全局负载均衡解决方案。 阅读详情
今天我们来讨论如何使用Dozer映射复杂类型:
            1. 数据类型不一致。
            2. 级联映射。
            3. 自定义映射。
    在讨论之前,我们来说说一个朋友在上篇留言中提到的一个问题。估计大家应该都很关心。这个问题就是性能问题。Dozer其实底层使用了现成的BeanUtil,通过反射来映射,况且Dozer应用了Cache技术,应该比自个通过BeanUtils映射性能要好点。所以一般的应用应该不存在性能问题。

    Dozer对于基本类型之间转换是不用配置的,比如Sting <------>Integer ,只要属性名称相同就Ok了。
    而常用的Date与String映射配置如下:
  <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之间双向映射。

    对于属性名称不一致,也仅仅需要一个配置文件,如下:
      <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>

    在后续的内容中,我们讨论如何得到映射统计数据。

Forward from http://www.blogjava.net/vincent/archive/2009/04/13/265377.html


西红柿成熟度检测数据集总结 成熟度类别标注数量semiripe(半成熟)10275rotten(腐烂)13470fullyripe(完全成熟)35031unripe(未成熟)26212。 阅读详情

相关推荐

数字蓝牙功放

数字蓝牙功放(TPA3110+BK8000L),基于D类数字功放芯片TPA3116蓝牙功放,HIFI级带滤波15Wx2蓝牙数字功放,支持有线和蓝牙两种音源输入

runweipa的博客 1420

使用dozerMapper实现类型转换 两个对象之间的类型转换

使用dozerMapper实现类型转换 两个对象之间的类型转换 第一步 首先引入maven依赖 <dependency> <groupId>net.sf.dozer</groupId> <artifactId>dozer-spring</artifactId> <version>5.5.1</version> </dependenc

weixin_45663675的博客 2192

最新测算源码PHP算命源码-风水八字-八字起名-塔罗牌占卜

未来,随着技术的发展和用户需求的变化,我们可以继续对系统进行升级和优化,以满足更多用户的需求和期望。数据库设计:创建一个名为bazi的数据库表,包含以下字段:id(自增ID)、name(姓名)、sex(性别)、birth_date(出生日期)、birth_time(出生时间)、bazi(八字结果)。数据库设计:创建一个包含塔罗牌信息的数据库表,如tarot_cards,包含字段:id(塔罗牌ID)、name(塔罗牌名称)、meaning(塔罗牌含义)等。根据操作系统的不同,PHP的安装方法会有所不同。

shanbeizi的博客 2421

maven alibaba JSON的依赖架包

&lt;!-- https://mvnrepository.com/artifact/com.alibaba/fastjson --&gt; &lt;dependency&gt; &lt;groupId&gt;com.alibaba&lt;/groupId&gt; &lt;artifactId&gt;fastjson&lt;/artifactId&gt; ...

孙小白 5万+

硬件电路(22)-TTL和232切换电路

工作中会遇到TTL和232电平的通信的状态,为了实现一种便捷的切换方式,参考了一些文章,提供一种电路方便大家使用。

剑藏锋的博客 1868

AI 生成测试报告:从 2 小时到 10 分钟

本文分享了AI在汽车电子测试报告生成中的应用案例。作者以某车企ECU测试项目为例,对比传统报告方式(每天2小时)与AI辅助方式(每天20分钟),效率提升83%。文章详细介绍了测试报告的核心要素(测试概况、结果、问题分析、发布建议)和不同类型报告(日报、周报、总结报告)的特点,并提供了从CANoe导出测试数据的Python解析脚本示例。通过AI自动化处理,大幅减少了测试工程师在报告整理上的时间投入,为汽车电子测试工作提供了实用效率提升方案。

小明的博客 446

Java工具类 BeanUtils库介绍以及对象拷贝

使用其提供的BeanUtils工具,具体的说只需要知道其中的两个方法就能实现类型的转换,很简单,降低了编程的难度。

java李阳勇的博客 3437

RAG 实战:LangChain + 向量数据库构建知识问答系统

从文档加载、分割、嵌入到检索增强生成,完整实现一个基于本地文档的知识问答系统。

kaixin110a的博客 189

不同类的属性值Copy工具类BeanCopyUtil

package com.zheng.ocr.common.util; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; /** ...

轻狂书生FS的博客 4492

一步一步教你如何安装IP-Guard(客户端WINDOWS篇)

1、安装完服务器后,在服务器右下角有一个IP-GUARD图标:如图 2、点图标右键选注册: 3、注册成功后, 4、在开始菜单里选生成客户端安装包。 5、生成客户端安装包成功,安装名字可以任意,但是最好是英文名字。 6、将客户端安装程序复制到桌面。 7、退出所有杀毒软件、安全卫士、电脑管家等然后运行 8、安装完成后,立即重启计算机。IPguard客户端安装完成。 9、这样在控制里就可以看到已经安装客户端的计算机,在线显示蓝色,灰色表示计算机已经离线货关机 ...

IP-Guard专栏 5631

手把手教你学simulink(43.2)--光伏发电场景示例:基于Simulink开发一个光伏发电系统仿真模型:采用神经网络控制策略进行优化

需求分析光伏发电系统(Photovoltaic System, PV)是将太阳能转换为电能的重要手段,广泛应用于分布式发电、并网发电和离网供电等领域。随着光伏技术的发展,如何提高光伏发电系统的效率和稳定性成为研究的重点。传统的控制策略(如PID控制器)虽然简单易实现,但在复杂工况下(如光照强度变化、温度波动等)难以达到最优性能。因此,引入先进的控制策略,如神经网络控制(Neural Network Control, NNC),可以显著提升系统的响应速度和鲁棒性。

MHD0815的博客 439

给两个不同类型的对象实现相同属性的拷贝

1. BeanUtils.copyProperties(source,target); demo: Log log = new Log(); log.setName("姓名"); log.setColumn("name"); BeanUtilsDemoLog beanUtilsDemoLog = new BeanUtilsDemoLog(); BeanUtils.copyProperties(log,beanUtilsDem

qq_38807606的博客 1193

国科大作业考试资料-人工智能原理与算法-2024新编-第十一次作业整理

1、有一位教授想知道学生是否睡眠充足。每天,教授观察学生在课堂 上是否睡觉,并观察他们是否有红眼。教授获得如下的领域知识: (1)没有观察数据时,学生睡眠充足的先验概率为0.7。 (2)给定学生前一天睡眠充足为条件,学生在晚上睡眠充足的概率是0.8;如果前一天睡眠不充足,则是0.3。 (3)如果学生睡眠充足,则红眼的概率是0.2,否则是0.7。 (4)如果学生睡眠充足,则在课堂上睡觉的概率是0.1,否则是0.3。 将这些信息形式化为一个动态贝叶斯网络,使教授可以使用这个网络从观察序列中进行滤波和预

MatsumotoChrikk 1056

Java Bean 映射工具 Dozer (转)

   分析多层架构的JEE系统,经常存在JavaBean直接的拷贝。比如在DAO层,我们通过POJO取得业务层需要的数据,将这些数据传递给Service层的VO。POJO与VO就存在典型的值拷贝。还有就是Webservice,客户端调用Webservice,也存在将大量返回值映射到相应的JavaBean里。呵呵 我们项目就是这个需求。     典型的解决方案就是手动拷贝,弊端很明显

zh_fn的专栏 2385

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

JavaBean之间拷贝利器-Dozer

[size=x-large][color=red]Dozer 使用总结,也许对你有帮助[/color][/size] [url]http://vincent1003.iteye.com/blog/762494[/url] 1.1 什么是dozer? Dozer 是一个对象转换工具。 Dozer可以在JavaBean到JavaBean之间进行递归数据复制,并且这些JavaBean可以...

pyzheng的专栏 663

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

JavaBean 映射工具 Dozer的应用

1.Dozer的简单应用 分析多层架构的J2EE系统,经常存在JavaBean直接的拷贝。比如在DAO层,我们通过POJO取得业务层需要的数据,将这些数据传递给Service层的VO。POJO与VO就存在典型的值拷贝。还有就是Webservice,客户端调用Webservice,也存在将大量返回值映射到相应的JavaBean里。 典型的解决方案就是手动拷贝,弊端很明显,代码...

喝拉菲的猫 218

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Java链式编程与Builder模式实战:告别面条代码,构建优雅对象

链式编程是一种通过让方法返回对象自身来实现连续调用的编程风格,其核心原理在于方法返回this引用,从而将多个操作串联成流畅的表达式。这种设计技巧能显著提升代码的可读性和编写效率,在Java中常用于构建复杂对象和处理流式数据。从技术价值看,链式编程不仅使代码更接近自然语言表达,还能有效管理对象状态,特别适合配置性操作。在实际应用场景中,Builder模式是链式编程的经典实践,它通过分离对象的构建与表示,解决了多参数构造器可读性差、JavaBean模式无法保证对象一致性的问题。本文以构建不可变对象为例,详细解析

weixin_34318272的博客 540

BeanCopier、BeanUtils 对象属性拷贝

开发为了隔离变化,常将 DAO 查询出来的DO和对前端提供的 DTO 隔离开来,它们的结构都是类似的。写很多冗长的b.setFiled(a.getFiled())这样的代码,是繁琐无意义的。于是需要简化对象拷贝方式。大多时候使用的是 Apache 或 Spring 的 BeanUtils,还有另一个更高效的属性拷贝方式:BeanCopier。 一、背景 1️⃣对象拷贝概念 Java,数据类型分为值类型(基本数据类型)和引用类型。对象拷贝分为浅拷贝(浅克隆)与深拷贝(深克隆)。 2️⃣示例前准备。源对象属性

ChineseSoftware的博客 2823

Dozer 自定义Converter -- LocalDateTime to Date

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34128237的博客 1814

Dozer List to String,字段类型List 映射成String,自定义custom-converter

Dozer List to String,字段类型List 映射成String,自定义custom-converter如何将String类型字段映射成 java 集合类型 List 等 如何将String类型字段映射成 java 集合类型 List 等 这里是数据库实体 public class Entity{ // 数据库中存放的逗号隔开的文件id private String fileIds; } 这个是目标映射对象,也是和前端对应的VO public class Vo{ private L

qq_32431037的博客 887

Dozer开发手册

1.为什么要映射 一个映射的框架在一个分层的体系架构中非常有用,特别是你在创建一个抽象的分层去包装一些特殊数据的变化 vs 这些数据传输到其它层(外部服务的数据对象、领域的数据对象、数据传输对象、内部服务数据对象)。因此一个映射框架非常适合于使用在映射器类型的类中,负责将数据从一个数据对象映射到另一个数据对象。 对于分布式系统,一个幅作用就在不同的系统中需要传输各自领域的数据对象,通常情况下,

tiandesheng111的专栏 1万+

解决BeanUtils.copyProperties复制时类型不匹配

解决BeanUtils.copyProperties复制时类型不匹配 1.背景 从DTO复制到VO的时候或者进行其他复制的时候,有可能出现两个实体类中某几个属性不一致问题。这时候,采用@Builder注解协助。 2.代码示例 @Builder添加到ApproveDenyServiceProviderResult上, //此处将返回值进行格式化处理 ApproveDenyServiceProviderResult resultBean = ApproveDenyServiceProviderResu

qq_43783527的博客 7092

JAVA复制对象时,遇到属性名、类型不同。推荐使用mapstruct

如何使用mapstruct解决复制时属性名、类型不同的问题1.引入pom包因为当在maven install时候会出现属性找不到错误。没有对生成的bean进行setter![新的改变](https://img-blog.csdnimg.cn/2710a1fff703417687658cf1074d47b8.png)2.新建一个接口3.如何调用 1.引入pom包 <dependency> <groupId>org.mapstruct</gr

qq_42467167的博客 2095

spring的BeanUtils.copyProperties(obj1, obj2);复制对象时字段类型不一致,导致赋值不上

当用spring的BeanUtils.copyProperties(obj1, obj2);对象进行复制时,因为在obj1 类型的对象中定义的属性类型不同(set方法中用的是Integer类型,get方法中返回的是int类型):   public int getNumber() {     return number;   }   public void setNumber(Int

mingtianhaiyouwo的博客 1万+

关于自动映射在项目中的具体落地(dozer)

项目开发过程中,经常需要编写model之间的转换,最常见的有:等操作,故为了简化代码的开发工作,需要简化对象属性之间复制的步骤,目前有两种解决方案,一种是定义converter 使用手写或插件生成,对各个属性进行set方法的设置。IDEA提供GenerateAllSetter插件,可帮助我们快速生成上述代码。另一中方案是使用自动映射框架进行属性的自动设置,基本有两种方向,一种是基于反射进行的,另一中是进行预编译生成相关代码,当然了 后一种在项目运行中效率是最高的。但是我们下面讲解的具体落地 使用的是基于反射

c1523456的博客 647

DozerBeanMapper对象转换(可以两个不同类型的javaBean,只要属性名、数据类型相同既可以转换)

一、maven依赖 <properties> <dozer.version>5.5.1</dozer.version> </properties> ​ <dependencies> <dependency> <groupId>net.sf.dozer</groupId> <artifactId>

li_tiantian的博客 1497
上一篇: 11g新特性:result cache 结果缓存
下一篇: JSP自定义标签开发入门
五柳-先生
博客等级 码龄16年 254粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值