CXF有坑(加拿大ossd课程有坑)
ccwgpt 2024-10-28 14:58 25 浏览 0 评论
问题来历:
早段时间,运营同学报了一个奇怪的case:A用户以B的身份参加了某营销活动。这种事情在系统中是毁三观的。但事实如此,究竟如何且听我道来。
一开始我们怀疑如下:
前端参数错误
业务有漏洞
遭到攻击
但经过检查,排除了以上可能。
接下来在大量日志中,有这样一个现象引起了我们的注意:
用户A | 用户B | |
发送数据 | info : {a:XXX1map : {c : YYY1}} | info : {a:XXX2map : {c : YYY2}} |
接口H 接收数据 | info : {a:XXX1map : {c : YYY1c : YYY2}} | info : {a:XXX2map : null} |
以上现象的日志是业务代码第一行输出的。就是说业务层刚开始拿到的数据就是错误的,于是做了错误的处理。难道是CXF框架的锅?(我们的rpc调用使用的是CXF进行的)
我们做了如下分析:首先历史以来,这个服务的数据一直正常,仅出现了这一例CASE,所以推测在高并发下产生的。
我抱着试一试的态度,在测试环境做了模拟,高并发下果然复现了。并做了如下测试,得出以下现象:
CXF 2.4.3高并发 | CXF 2.4.3低并发 | CXF 3.0.12高并发 | |
JDK1.6 编译高并发 | 高概率复现 | 不复现 | 不复现 |
JDK1.6 编译低并发 | 不复现 | 不复现 | 不复现 |
JDK1.7 编译高并发 | 不复现 | 不复现 | 不复现 |
以上现象让我苦思良久,这个问题是毁三观的。
首先,JDK升级怎么可能影响业务数据呢?难道是JDK编译后性能提升减小了复现概率?JDK编译出来的字节码不一致?难不成CXF和JDK都同时修复了这个问题?
在苦于无法找出答案时,无意中发现单步调试的代码和测试环境的不一致。才发现原来CXF使用maven的特性在jdk版本不同时依赖的lib也不相同。
到此为止,可以断定这个问题是CXF依赖引起的。
最关键问题发现后,接下来我去单步的跟进了CXF的代码,经过几次来回调试,终于定位到是jaxb-impl-2.1.13.jar的原因,问题代码如下:
原来这里的itemsLoader是一个单例于是里面的target和map两个变量在多线程时是临界资源。果然在2.1.14中修复了这个问题。修复的方式就是把它们变成了线程变量,代码如下:
至此问题排查完毕。我只想说CXF留的这个坑害人不浅。
后记:
很多人在使用xml解析时应该都了解过jaxb,因为这个lib是java 虚拟机中就自带的,可以说是java的基础组件。但是如此基础的组件怎么可能需要开发者再去写个adapter来做些解析呢?第一次使用jaxb时遇到这个问题的人一定很困惑。其实我也困惑了很久,我想就是因为JAXB XML标签不支持复杂类型的数据结构,包括array也是不支持的。
CXF:
/* Map passing
* JAXB also does not support Maps. It handles Lists great, but Maps are
* not supported directly. They also require use of a XmlAdapter to map
* the maps into beans that JAXB can use.
*/
@XmlJavaTypeAdapter
(IntegerUserMapAdapter.
class
)
Map<Integer, User> getUsers();
官方声明:http://cxf.apache.org/docs/a-simple-jax-ws-service.html
JAXB设计上不支持Map类型,支持类型如下:
https://docs.oracle.com/javase/tutorial/jaxb/intro/bind.html
但是:array就可以不用adapter啊。为啥Map就必须用呢?Map确实不是必须用的,如jaxb官网描述string-string就没有用。直接是这样的:http://camel.apache.org/jaxb.html
When marshalling using JAXB or SOAP then the JAXB implementation will automatic assign namespace prefixes, such as ns2, ns3, ns4 etc. To control this mapping, Camel allows you to refer to a map which contains the desired mapping.
Notice this requires having JAXB-RI 2.1 or better (from SUN) on the classpath, as the mapping functionality is dependent on the implementation of JAXB, whether its supported.
For example in Spring XML we can define a Map with the mapping. In the mapping file below, we map SOAP to use soap as prefix. While our custom namespace "http://www.mycompany.com/foo/2" is not using any prefix.
那么问题来了,为啥复杂Map就不能支持了呢?其实是基于标签描述变量名的方式,其描述Map时的数据只能达到某个变量而无法明确变量的具体类型,在java这种强类型语言中将导致无法实例化,所以这也就是不支持Map的真实原因吧。
相关推荐
- 用Steam启动Epic游戏会更快吗?(epic怎么用steam启动)
-
Epic商店很香,但也有不少抱怨,其中一条是启动游戏太慢。那么,如果让Steam启动Epic游戏,会不会速度更快?众所周知,Steam可以启动非Steam游戏,方法是在客户端左下方点击“添加游戏”,然...
- Docker看这一篇入门就够了(dockerl)
-
安装DockerLinux:$curl-fsSLhttps://get.docker.com-oget-docker.sh$sudoshget-docker.sh注意:如果安装了旧版...
- AYUI 炫丽PC开发UI框架2016年6月15日对外免费开发使用 [1]
-
2016年6月15日,我AY对外发布AYUI(WPF4.0开发)的UI框架,开发时候,你可以无任何影响的去开发PC电脑上的软件exe程序。AYUI兼容XP操作系统,在Win7/8/8.1/10上都顺利...
- 别再说C#/C++套壳方案多了!Tauri这“借壳生蛋”你可能没看懂!
-
浏览器套壳方案,C#和C++有更多,你说的没错,从数量和历史积淀来看,C#和C++确实有不少方式来套壳浏览器,让Web内容在桌面应用里跑起来。但咱们得把这套壳二字掰扯清楚,因为这里面学问可大了!不同的...
- OneCode 核心概念解析——Page(页面)
-
在接触到OneCode最先接触到的就是,Page页面,在低代码引擎中,页面(Page)设计的灵活性是平衡“快速开发”与“复杂需求适配”的关键。以下从架构设计、组件系统、配置能力等维度,解析确...
- React是最后的前端框架吗,为什么这么说的?
-
油管上有一位叫Theo的博主说,React是终极前端框架,为什么这么说呢?让我们来看看其逻辑:这个标题看起来像假的,对吧?React之后明明有无数新框架诞生,凭什么说它是最后一个?我说的“最后一个”不...
- 面试辅导(二):2025前端面试密码:用3个底层逻辑征服技术官
-
面试官放下简历,手指在桌上敲了三下:"你上次解决的技术难题,现在回头看有什么不足?"眼前的候选人瞬间僵住——这是上周真实发生在蚂蚁金服终面的场景。2025年的前端战场早已不是框架熟练...
- 前端新星崛起!Astro框架能否终结React的霸主地位?
-
引言:当"背着背包的全能选手"遇上"轻装上阵的短跑冠军"如果你是一名前端开发者,2024年的框架之争绝对让你眼花缭乱——一边是React这位"背着全家桶的全能选...
- 基于函数计算的 BFF 架构(基于函数计算的 bff 架构是什么)
-
什么是BFFBFF全称是BackendsForFrontends(服务于前端的后端),起源于2015年SamNewman一篇博客文章《Pattern:BackendsFor...
- 谷歌 Prompt Engineering 白皮书:2025年 AI 提示词工程的 10 个技巧
-
在AI技术飞速发展的当下,如何更高效地与大语言模型(LLM)沟通,以获取更准确、更有价值的输出,成为了一个备受关注的问题。谷歌最新发布的《PromptEngineering》白皮书,为这一问题提供了...
- 光的艺术:灯具创意设计(灯光艺术作品展示)
-
本文转自|艺术与设计微信号|artdesign_org_cn“光”是文明的起源,是思维的开端,同样也是人类睁眼的开始。每个人在出生一刻,便接受了光的照耀和洗礼。远古时候,人们将光奉为神明,用火来...
- MoE模型已成新风口,AI基础设施竞速升级
-
机器之心报道编辑:Panda因为基准测试成绩与实际表现相差较大,近期开源的Llama4系列模型正陷入争议的漩涡之中,但有一点却毫无疑问:MoE(混合专家)定然是未来AI大模型的主流范式之一。...
- Meta Spatial SDK重大改进:重塑Horizon OS应用开发格局
-
由文心大模型生成的文章摘要Meta持续深耕SpatialSDK技术生态,提供开自去年9月正式推出以来,Meta持续深耕其SpatialSDK技术生态,通过一系列重大迭代与功能增强,不断革新H...
- "上云"到底是个啥?用"租房"给你讲明白IaaS/PaaS/SaaS的区别
-
半夜三点被机房报警电话惊醒,顶着黑眼圈排查服务器故障——这是十年前互联网公司运维的日常。而现在,程序员小王正敷着面膜刷剧,因为公司的系统全"搬"到了云上。"部署到云上"...
- php宝塔搭建部署thinkphp机械设备响应式企业网站php源码
-
大家好啊,欢迎来到web测评。本期给大家带来一套php开发的机械设备响应式企业网站php源码,上次是谁要的系统项目啊,帮你找到了,还说不会搭建,让我帮忙录制一期教程,趁着今天有空,简单的录制测试了一下...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- 用Steam启动Epic游戏会更快吗?(epic怎么用steam启动)
- Docker看这一篇入门就够了(dockerl)
- AYUI 炫丽PC开发UI框架2016年6月15日对外免费开发使用 [1]
- 别再说C#/C++套壳方案多了!Tauri这“借壳生蛋”你可能没看懂!
- OneCode 核心概念解析——Page(页面)
- React是最后的前端框架吗,为什么这么说的?
- 面试辅导(二):2025前端面试密码:用3个底层逻辑征服技术官
- 前端新星崛起!Astro框架能否终结React的霸主地位?
- 基于函数计算的 BFF 架构(基于函数计算的 bff 架构是什么)
- 谷歌 Prompt Engineering 白皮书:2025年 AI 提示词工程的 10 个技巧
- 标签列表
-
- 框架图 (58)
- flask框架 (53)
- quartz框架 (51)
- abp框架 (47)
- jpa框架 (47)
- springmvc框架 (49)
- 分布式事务框架 (65)
- scrapy框架 (56)
- shiro框架 (61)
- 定时任务框架 (56)
- java日志框架 (61)
- JAVA集合框架 (47)
- mfc框架 (52)
- abb框架断路器 (48)
- ui自动化框架 (47)
- beego框架 (52)
- java框架spring (58)
- grpc框架 (55)
- ppt框架 (48)
- 内联框架 (52)
- cad怎么画框架 (58)
- ps怎么画框架 (47)
- ssm框架实现登录注册 (49)
- oracle字符串长度 (48)
- oracle提交事务 (47)