Spring Orika Bean Copy 属性丢失问题说明

BeanUtils工具类实现Bean拷贝详解 BeanUtils工具类实现Bean拷贝使用详解。 真正学会Bean拷贝! 阅读详情

一、背景说明
考虑到bean复制性能问题,在SSM框架中使用引入了orkia 实现bean复制。上线一段时间后,发现部分线上机器出现bean复制后属性丢失问题,重启后正常

二、问题详细说明
在线上机器使用orika 进行bean复制时,在bean属性类型、名称相同情况下无法赋值的情况,属性值全为null,其中最特别的仅出现在部分bean上,大部分bean复制完全正常,并且出现问题的bean不固定(每次重启都会变),tomcat容器重启恢复正常。

三、问题尝试解决
1、在问题发生后,tomcat容器重启后恢复正常,首先想到的是在 orkia 进行bean 复制时依赖的jar包冲突导致的(浪费了大量时间),简略说明下,在orkia-core 1.4.5 包下需要依赖的包中如下所示:

<dependency>
	<groupId>org.javassist</groupId>
	<artifactId>javassist</artifactId>
</dependency>
<dependency>
	<groupId>com.thoughtworks.paranamer</groupId>
	<artifactId>paranamer</artifactId>
</dependency>
<dependency>
	<groupId>org.slf4j</groupId>
	<artifactId>slf4j-api</artifactId>
</dependency>
<dependency>
	<groupId>com.googlecode.concurrentlinkedhashmap</groupId>
	<artifactId>concurrentlinkedhashmap-lru</artifactId>
</dependency>
<dependency>
	<groupId>com.carrotsearch</groupId>
	<artifactId>java-sizeof</artifactId>
</dependency>

其中最容易出现jar包冲突的是javassist 和 slf4j-api 这两个包,通过jar包排除统一版本后,在夜深人静时上线,一切正常。


过一段时间后白天上线又出现同样的问题,中间耗费了大量的时间,经过各种日志排查监控,通过排除法确定,发生问题的机器是在服务器发布上线重启时,接到了用户的请求,由于上线操作员是个急性子刚将线上机器从软负载上摘掉就进行了机器重启,软负载缓存未过期,导致线上用户请求打到重启机器上。

2、结合1步排查结果,继续进行问题定位,组中发现在orkia文档中写到一句话,具体地址内容如下所示:
http://orika-mapper.github.io/orika-docs/faq.html

得到结果在 spring 中使用orkia 时需要将 ConfigurableMapper 定义成单例模式,结合着这个提示对我们代码进行排查,发现我们代码如下所示:

@Component
public class BeanMapper implements InitializingBean {
    private MapperFacade mapper;
    @Override
    public void afterPropertiesSet() throws Exception {
        if(mapper == null){
            MapperFactory mapperFactory = new DefaultMapperFactory.Builder().build();
            mapper = mapperFactory.getMapperFacade();
        }
    }
	public  <S, D> D map(S source, Class<D> destinationClass) {
        return mapper.map(source, destinationClass);
    }
}

进一步结合orkia 源码进行问题查找,发现MapperFacadeImpl 中会将赋值的bean信息统一存到到 MappingContext 中的typeCache存到内部属性中,其数据结构OpenIntObjectHashMap 类型。

进一步猜测得知由于此时MapperFacade 是懒加载方式,可能是在bean存储到MappingContext 之前,接到到了用户的请求,先一步将需要复制的bean存储到了MappingContext中,在 MappingContext中存储的bean 信息为null,最终导致问题的产生,这里仅是结合和orkia源码进行猜测,是否正确有待考察(在本地tomcat环境无法重现此问题)。

四、解决方案
将MapperFacade 改为预加载方式,具体修改后代码如下所示:

@Component
public class BeanMapper {
 
    private final static MapperFactory mapperFactory = new DefaultMapperFactory.Builder().build();
     
    private final static MapperFacade mapper = mapperFactory.getMapperFacade();
	
    public  <S, D> D map(S source, Class<D> destinationClass) {
        return mapper.map(source, destinationClass);
    }
}

通过以上方式最终解决问题。问题关键点如下所示:
1、MapperFacade 需要配置为单例
2、MapperFacade需要配置为预加载

 

整车 EOL下线 测试系统介绍 整车下线(EOL)测试专门针对整车进行设计开发,是车企将组装好的整车交付客户前的 最后一道检测工序。EOL 测试针对的是整车下线测试,不同于零部件下线,是整车级别的下线 测试,测试过程关系整车的每个零部件,其测试质量直接影响到整车的质量好坏。因此,整车EOL测试是整车下线必不可少的测试过程. 阅读详情

相关推荐

西瓜书第二章——模型评估与选择(十折交叉验证/查准查全F1)

第二章——模型评估与选择

xsddys的博客 953

CopyUtil(java复合bean的copy)

诞生由来 之前项目里就经常有bean之间的属性copy,一直都是用spring自带的工具类来解决,方法如下: org.springframework.beans.BeanUtils#copyProperties(java.lang.Object, java.lang.Object); 该方法只能对一个bean中普通属性字段进行copy,如果这个bean中有其他的bean,即bean中bean,就...

qq_37276508的博客 3752

论文学习:Towards Automated Infographic Design:Deep Learning-based Auto-generation of Extensible Timeline

title: “Towards Automated Infographic Design:Deep Learning-based Auto-generation of Extensible Timeline” tags: [“论文评述”, “报告”] date: 2019-08-22 author: 叶慧 mathjax: true 论文:Towards Automated Infograph...

xiaoyehahaha的博客 731

BeanCopier属性复制值全为null

一、问题 在解决一个参数校验过程中,发现beanCopier复制的所有值全为null。beanCopier使用代码如下 public static <T> T copy(T src) { T target = null; try { if (null != src) { target = (T) src.getClass().newInstance(); BeanCopier beanCopier = BeanCo

qq_39084191的博客 2954

【模型构建器教程】教你在ArcGIS中如何按照字段值批量导出shp文件

【模型构建器教程】教你在ArcGIS中如何按照字段值批量导出shp文件

weixin_45469245的博客 6454

遥感生态指数(RSEI)——四个指数的计算

遥感生态指数是在4个生态指数的基础上通过主成分变换得出的一个评价生态环境质量的指标。因此,第二部分就是要分别计算出这4个指数的值。 ①首先,是绿度指数的计算,一般用归一化植被指数(NDVI) NDVI=(NIR-Red)/(NIR+Red) 在Bandmath工具中输入NDVI计算公式 (float(b4-b3))/(b4+b3) 其中,b3、b4分别是红波段和近红外波段 ②其次,是湿度计算。 WET = c1B1 + c2B2 + c3B3...

qq_41978498的博客 9万+

Orika JavaBean映射工具使用

Orika是一个简单、快速的JavaBean拷贝框架,它能够递归地将数据从一个JavaBean复制到另一个JavaBean,这在多层应用开发中是非常有用的。

京东科技开发者 339

银河麒麟系统完美安装EasyConnect

Kylin V10桌面版完美安装EasyConnect

weixin_53874797的博客 1万+

自定义BeanUtils.copyProperties工具类

自定义BeanUtils.copyProperties工具类

YangxHa1999的博客 690

Colab虚拟环境配置全攻略:从安装到实战应用

本文详细介绍了在Google Colab中配置Python虚拟环境的完整流程与实战技巧。通过安装Anaconda、创建独立环境、解决常见错误及结合深度学习项目应用,帮助用户有效管理依赖、避免冲突,并利用环境持久化策略提升在Colab中的开发效率与项目可复现性。

weixin_29204121的博客 339

在RStudio中使用GitHub Copilot:代码自动生成,从此告别手敲!

可以通过自定义提示词来引导Copilot生成符合自己需求的代码。再看一个做统计分析的。

Codewar的博客 331

springboot版本升级的坑,BeanUtils的copyProperties方法值丢失问题

springboot版本升级的坑,BeanUtils的copyProperties方法值丢失问题

枕着猫咪睡觉的王子 2691

Win11右下角不显示图标怎么办?Win11右下角不显示图标的解决方法

所以有不少符合资格的小伙伴都下载进行体验了,但是有的小伙伴在升级完系统之后发现桌面右下角不显示任何图标,那么遇到这种情况要怎么办呢?下面就和小编一起来看看有什么解决方法吧。2、接着找到任务栏设置中的“taskbar corner overflow”。3、然后在下方勾选打开想要显示的图标程序就可以了。1、首先右键任务栏,在其中选择“任务栏设置”。目前微软已经正式推出了。

2401_88800025的博客 885

BeanUtil拷贝对象或集合时属性名不对应导致为空

BeanUtil拷贝对象或集合时属性名不对应导致字段为空

Java_Rookie_Xiao的博客 2344

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

什么是脏数据?怎样用箱形图分析异常值?终于有人讲明白了

导读:数据质量分析是数据挖掘中数据准备过程的重要一环,是数据预处理的前提,也是数据挖掘分析结论有效性和准确性的基础。没有可信的数据,数据挖掘构建的模型将是空中楼阁。数据质量分析的主要任务...

华章IT官方博客 1112

使用BeanUtils.copyProperties引发的问题

概述 对象之间的转换在开发中是最常见的,实体对象和数据显示层(VO,DTO等)的转换,通常有 2 种做法: set 方法赋值,这种方式一般使得代码冗余,而且极不美观; 对象拷贝工具类,如 Spring 的 BeanUtils.copyProperties 。 而我最近在使用 Spring 的拷贝工具类的时候碰到了属性值丢失的情况,先看这样一个栗子。 订单实体类到 VO 层的转换: 转换后的结果如下: 从上面可以看到 2 个问题: 对象 copy 后没有 id 并没有赋值; VO 对象的改变影响了原

个人站点:javatv.net 5440

SpringBoot 项目中 Bean 拷贝及工具类封装

在Spring或SpringBoot项目中有为我们提供一个BeanUtils工具类。

huang714的专栏 1445

Bean复制忽略null值,BeanUtils

大部分情况下 我们复制bean用的是 Spring的BeanUtils import org.springframework.beans.BeanUtils; 但是target中非空的字段会被source中空值覆盖 然而有时候不想被null值覆盖 这时候! <dependency> <groupId>cn.hutool</groupId> ...

雪落南城的博客 4135

BeanUtils复制对象null问题记录

BeanUtils.copyProperties()一般用于多方数据整合,可以很方便的对两条数据中相同属性名的数据进行复制,但有会出现多次复制将最后一次数据作为最后的结果。比如有三个对象 A , B ,C 分别有两个属性name,age A a = new A(); a.setName("aName"); //a age = null; B b = new B(); //b name = null; b.setAge("bAge"); C c = new C(name,age); //此处c想要整合一.

Fishman113的博客 903

BeanUtils.copyProperties参数为null的时候不复制

BeanUtils.copyProperties()属性为null也会被复制,所以自己定义一个属性为null不复制的方法 public static String[] getNullPropertyNames (Object source) { final BeanWrapper src = new BeanWrapperImpl(source); java....

伟大是熬出来的 1万+

常见Bean拷贝框架使用姿势及性能对比

再实际的项目中,正好遇到了这个问题,不仅慢,还发现会有锁竞争,这特么就尼普了。上面的测试中,存在一个不同的变量,即不是用相同的source对象来测试不同的工具转换情况,但是这个不同并不会太影响不同框架的性能对比,基本上从上面的运行结果来看。MapStruct 性能更强悍了,缺点也比较明显,需要声明bean的转换接口,自动代码生成的方式来实现拷贝,性能媲美直接的get/set。当然我们现在一般用的Spring5+了,这段代码也早就做了改造了,新版的如下,不再存在上面的这个并发问题了。

weixin_44882412的博客 2758

bean 拷贝工具类Orika BeanUtils

import ma.glasnost.orika.MapperFacade; import ma.glasnost.orika.impl.DefaultMapperFactory; import ma.glasnost.orika.metadata.Type; import ma.glasnost.orika.metadata.TypeFactory; import java.util.List; /** * @author koala * @Description: orika 的工具类 * .

拱卒的博客 937

Spring学习笔记(二)【CGLIB浅拷贝BeanCopier的使用和详解】

常用的bean拷贝工具类当中,主要有Apache提供的beanUtils、Spring提供的beanUtils、Cglib提供的beanCopier,性能上分析如下表所示

Vinjcent 7498

spring bean拷贝问题,效率比较

首先公司内部就遇到过 commons 包的 BeanUtils 进行属性拷贝性能较差的真实案例,然后该同事换成了 Spring 的 BeanUtils 性能好了很多,感兴趣大家可以使用性能测试框架或者基准测试框架去对比,这里就不对比了。 接下来我们看 Spring 的 BeanUtils 的属性拷贝会存在啥问题: @Data public class A { private String name; private List ids; } @Data public class B

anjingaigege的专栏 1273

spring的BeanUtils属性copy

1、使用 BeanUtils.copyProperties将一个对象的属性copy到另外一个对象中。 2、copy的原理是获取需要copy属性的属性描述器(PropertyDescriptor),获取目标属性的PropertyDescriptor,并获取writeMethod,获取源属性的readMethod,将readMethod得到的结果(Object)写入到writeMethod中,所...

styhm的专栏 4058
上一篇: nginx 配置Https强转和Cross跨域配置撞车遇到的坑
下一篇: 微服务拆分之通用工具jar包管理方案
TimerBin
博客等级 码龄12年 54粉丝 119原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值