完蛋,被扣工资了,都是JSON惹的祸

@Autowired(required=false)注入注意的问题 1、前言在使用spring开发过程中,我们基本上都是使用@Autowired这个注解,用来注入已有的bean。但是有些时候,会注入失败。当我们加上参数(required=false)就能解决。今天整理一个我在实际开发中的例子2、required属性@Autowired(required=true):当使用@Autowired注解的时候,其实默认就是@Autowired(required=true)... 阅读详情

JSON是一种轻量级的数据交换格式,基于ECMAScript的一个子集设计,采用完全独立于编程语言的文本格式来表示数据。它易于人类阅读和编写,同时也便于机器解析和生成,这使得JSON在数据交换中具有高效性。‌

JSON也就成了每一个程序员每天都要使用一个小类库。无论你使用的谷歌的gson,阿里巴巴的fastjson,框架自带的jackjson,还是第三方的hutool的json等。总之,每天都要和他打交道。

但是,却在阴沟里翻了船。

1、平平无奇的接口

 /**
     * 获取vehicleinfo 信息
     *
     * @RequestParam vehicleId
     * @return Vehicle的json字符串
     */
    String loadVehicleInfo(Integer vehicleId);

该接口就是通过一个vehicleId参数获取Vehicle对象,返回的数据是Vehicle的JSON字符串,也就是将获取的对象信息序列化成JSON字符串了。

2、无懈可击的引用

String jsonStr = auctVehicleService.loadVehicleInfo(freezeDetail.getVehicle().getId());
if (StringUtils.isNotBlank(jsonStr)) {
    Vehicle vehicle = JSON.parseObject(jsonStr, Vehicle.class);
    if (vehicle != null) {
        // 后续省略 ... 
    }
}

看似无懈可击的引用,隐藏着魔鬼。为什么无懈可击,因为做了健壮性的判断,非空字符串、非空对象等的判断,根除了空指针异常。

但是,魔鬼隐藏在哪里呢?

3、故障引发

线上直接出现类似的故障(此报错信息为线下模拟)。

现在测试为什么没有问题:主要的测试了基础数据,测试的数据中恰好没有Date 类型的数据,所以线下没有测出来。

4、故障原因分析

从报错日志可以看出,是因为日期类型的参数导致的。Mar 24, 2025 1:23:10 PM 这样的日期格式无法使用Fastjson解析。

深入代码查看:

@Override
public String loadVehicleInfo(Integer vehicleId) {
    String key = VEHICLE_KEY + vehicleId;
    Object obj = cacheService.get(key);

    if (null != obj && StringUtils.isNotEmpty(obj.toString())
            && !"null".equals(obj.toString())) {
        String result = (String)obj;
        return result;
    }

    String json = null;
    try {
        Vehicle vInfo = overrideVehicleAttributes(vehicleId);
        // 使用了Gson序列化对象
        json = gson.toJson(vInfo);
        cacheService.setExpireSec(key, gson.toJson(vInfo), 5 * 60);
    } catch (Exception e) {
        cacheService.setExpireSec(key, "", 1 * 60);
    } finally {
    }

    return json;
}

原来接口的实现里面采用了谷歌的Gson对返回的对象做了序列化。调用的地方又使用了阿里巴巴的Fastjson发序列化,导致参数解析异常。

完蛋,上榜是要被扣工资的!!!

5、小结

问题虽小,但是影响却很大。坊间一直讨论着,程序员为什么不能写出没有bug的程序。这也许是其中的一种答案吧。

完蛋,上榜是要被扣工资的!!!

–END–


喜欢就点赞收藏,也可以关注我的微信公众号:编程朝花夕拾

jsp页面打jar包及其引用 1、前言 项目开发中,需要把一些公共页面抽取到公用的项目中,打成jar包全局使用,便于修改和维护。最常见的就是会把公用的方法或者实体类打成jar包,这种很好用,直接导入依赖,导包就完事了。但是页面的打包笔者开发的时候,搞了好久,终于搞定。记录一下,方便日后使用。 2、页面的打包 正确的打包方式,开发者可以像页面在项目中一样的方式去引用(js、css等同理)。 jar工程只用两个主要的文件夹src 阅读详情

相关推荐

Redis7系列:Redis对决RedisStack

Redis 是一个开源的内存数据库,以高性能、低延迟著称,支持基础数据结构(如字符串、哈希、列表、集合、有序集合等),常用于缓存、消息队列、实时数据处理等场景。Redis Stack 是 Redis 的扩展版本,整合了 Redis 核心数据库与多个高级功能模块(如全文搜索、JSON 文档存储、图数据库、时间序列等),提供“一站式”解决方案,简化了复杂数据场景的开发。

static_coder的博客 2897

2.4 java面试题:Netty

Netty 是一个,用于快速开发高性能、高可靠性的网络 IO 程序。它在 Java 领域中的地位,就像“网络编程的 Spring”,几乎统治了所有需要自定义协议的中间件和分布式组件。老练的 Java 工程师说 Netty,不仅要讲“是什么”,还要讲清它,以及。

你是人间四月天 219

AI 网关一把 Key 接通 Claude Code 与 Codex 实战(附配置)

在研发与 SRE 团队中,通常会通过自建 AI 网关(如 Sub2API 等多上游聚合网关)向工程师发放统一的sk-API Key,背后挂载 OpenAI(GPT 系列)、xAI(Grok 系列)、DeepSeek 等上游账号池。当工程师尝试把同一把sk-密钥同时配置到Codex CLI与Cursor 内置终端协议转发被拒:复合分组(composite)下只有 OpenAI/Grok/DeepSeek 账号,没有原生 Anthropic 账号,Claude Code 调直接返回。/model。

探索云原生与智能化驱动下的安全运维新范式。关注DevSecOps、可观测性、AIOps等前沿领域,与您共赴技术前沿。 139

logback的简单使用

1、前言 查了很多资料,都说logback的性能都要比log4j的性能要好,logback逐渐要取代log4j。今天对logback作一个简单的整理。 2、logback的依赖坐标 <!-- <dependency> <groupId>org.slf4j</groupId> <artifactId&...

static_coder的博客 2万+

异步fifo的UVM验证(最终最终版)

更新了refmdl以及scb

qq_44674008的博客 2988

MATLAB2022b安装

图文并茂,手把手教会你怎么安装MATLAB2022b

1万+

FORM表单的几大属性

FORM表单的几大属性问题引入 在做一个活动支付项目的时候,提交订单(form表单)跳转支付页面发现没有反应。经过断点排查发现断点也进了,不报错。但是返回的就是空白页,让人很纠结。 进过反复测试,才发现是杀毒软件拦截了form表单的请求。如何来解决这个问题呢?下来我们来看看Form表单的属性就会明白了。 FORM的属性 method属性:规定用于发送 form-data 的 HTTP

static_coder的博客 1万+

华为昇腾 Atlas 200I DK A2 开发板编程接口学习入门:系统安装和开发步骤、注意事项与典型案例实战

华为昇腾开发板编程接口指南:从入门到进阶 本文系统介绍了华为昇腾开发板的编程接口体系,涵盖MindXSDK和AscendCL两大核心框架。MindXSDK提供高层封装接口,适合快速搭建视觉应用;AscendCL则是底层接口,需手动管理设备内存。文章详细讲解了: 开发环境搭建步骤,包括系统配置、依赖安装 MindXSDK组件化编程流程(图像分类实例) AscendCL底层开发方法(内存管理、模型推理) 常见问题解决方案和调试技巧 两个典型应用实例(摄像头目标检测和图像分类) 针对小白开发者,推荐从MindXS

bother3000的博客 2425

spring容器启动,初始化某个方法(init)

1、前言 很多时候,我们需要在项目启动的时候,就要完成某些方法的执行。今天整理了一个简单的方法,使用spring容器中bean的属性:init-method 2、代码/* 初始化的类。这里不需要添加任何注解 */ public class InitData { @Autowired private UserService userService; /*

static_coder的博客 1万+

用limma包进行多组差异表达分析

写在前面:最近在使用limma包进行差异表达分析,参考了网上许多教程都觉得说的云里雾里,很不清楚。经过我自己一段时间非常痛苦的钻研,弄明白了,解决了我的实际需求。于是决定将我的分析经验写下来,分享给需要的人。 首先加载前期预处理好的表达矩阵。(我的原始表达矩阵文件已附在文后,大家有需要可以下载实践) setwd("E://Rworkplace") data<-read.table...

weixin_40640700的博客 4万+

STM32+W5500实战:5分钟搞定FreeModbus TCP移植(附完整代码)

本文详细介绍了如何在STM32微控制器上,结合W5500以太网芯片,快速完成FreeModbus TCP协议栈的移植,构建稳定可靠的工业级Modbus TCP服务器。内容涵盖硬件连接、软件架构、驱动适配、核心移植代码实现及调试优化技巧,旨在提供可直接应用于实际项目的完整解决方案。

life6的博客 879

图片转化为base64及上传

1、前言 很多时候我们需要将图片转化成base64,并且上传。这里整理了一些关于图片转化base64的方法,方便以后使用。 2、页面demo html&gt; head lang=&quot;en&quot;&gt; meta charset=&quot;UTF-8&quot;&gt; title&gt;图片转化成Base64title&gt; head&gt;

static_coder的博客 1万+

VMware vCenter 6.7证书过期急救指南:从503报错到完美修复的全流程

本文详细解析了VMware vCenter 6.7因STS证书过期导致503报错的根本原因,并提供了一套从诊断到修复的完整实战流程。内容包括使用checksts.py脚本检测STS证书状态,通过fixsts.sh脚本更新证书,以及利用Certificate-Manager全面重置所有过期证书,帮助管理员快速恢复服务并避免常见陷阱。

weixin_29234239的博客 770

IntelliJ IDEA AI Assistant 携带OpenCode保姆级安装教程来了

的安装包,只不过界面没有明确的提示。可能由于网络原因下载失败,导致对话框无法使用。官方推出的 AI 驱动插件,专为软件开发设计。但是之前由于需要订阅才能使用,安装了之后又卸载了。安装上一节已经介绍了,这里不在赘述。明显显示已经安安装好了,几乎秒级安装,怎么感觉都有点离谱。但是在对话框无法使用,无法发出信息,也没有选择模型的地方。高版本中,必须登录之后才能使用,如果初次使用需要认证输入。其他的AI客户端大同小异,感兴趣的老铁快去试试吧。上面介绍了在线安装的方法。模式分析,没有问题了在修改。

static_coder的博客 8354

[Unity开发] [PICO]避坑指南:PICO商店上传APP时PXR Platform APPID设定详解

PICO开发者上传Unity应用时常见的"APPID不符"问题,主要源于混淆了开发者后台两个不同位置的APPID。

每日出拳老爷子的博客 556

37、OpenMP:并行编程的强大工具

本文详细介绍了 OpenMP 的核心功能和使用方法,包括执行环境例程、线程同步与协调机制,如关键区域、屏障、原子操作、归约子句、刷新构造和锁机制。此外,还提供了多个实践练习,涵盖矩阵乘法的并行实现、任务池与流水线模式的应用、读写锁的扩展与移植,以及客户端-服务器模式的实现与优化。通过这些内容,读者可以全面掌握 OpenMP 在并行编程中的实际应用与性能优化技巧。

www00的博客 105

IdentityHashMap :key值可以重复的Map集合

问题引入 初学java的时候,Map集合给人留下的印象就是键值对{key=value}的存储方式。并且我们知道键值对的可以唯一。但是Map容器真的不能存储key值相同的数据吗?查询API才发现有这么一个实现类可以存储重复的key:IdentityHashMap。IdentityHashMap简介 IdentityHashMap类同样实现了Map接口,拥有Map集合的一切特性。key值同样需要

static_coder的博客 5068

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

TeamViewer、向日葵平替?这几款免费远程控制软件,真香!

号称时尚最安全的远程桌面。这是一款近年来在中国市场非常火爆的远程控制软件,因其对国内网络环境做了深度优化,在速度和延迟方面表现优异,被许多人视为。

static_coder的博客 4088

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

针对iphone手机拍照片旋转90度问题解决

/* 1、图片上传的方法 */ @RequestMapping(value = "/uploadPic", method = RequestMethod.POST) @ResponseBody public JsonResult upload(@RequestParam("file") MultipartFile[] files){ Boolean flag

static_coder的博客 3937

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

springboot集成webSocket实现网络实时通讯

1、前言 在很多业务场景中,对实时数据要求比较高,我们就不能采用轮训拉取的方式来获取数据了。就可以采用websocket的长链接的形式,实时有服务端或者客户端推送数据,已达到数据的实时展示。 2、websocket简介 SpringBoot官方推荐的基于STOMP实现,STOMP:即Simple Text Orientated Messaging Protocol,它是一个简单的文本消息传输协议,属于 WebSocket 的子协议, 提供了一个可互操作的连接格式,允许STOMP客户端与任意...

static_coder的博客 3803

使用shiro标签遇到的坑

1、前言 使用shiro框架做权限控制是不错的选择,在使用shiro标签的过程中,是否会遇到一些坑呢。恰好笔者遇到了,在此记录一下。 2、shiro标签坑的描述 标签: <shiro:haspermission name="你的权限"></shiro:haspermission> 当使用的标签具有层级关系的时候,就有可能掉坑里,并且出不来。 例如: 第一层级...

static_coder的博客 3526

java使用Qrcode生成二维码(内嵌logo)

1、前言 整理一个使用qrcode.jar生成二维码的测试方法,以备后面学习使用。 2、使用准备Qrcode.jar3、demo /* 生成二维码 */ @RequestMapping(value="/creatQrcode", method = RequestMethod.POST) @ResponseBody public Object

static_coder的博客 3522

springmvc 框架中的数据的绑定:@InitBinder&@DateTimeFormat()

1、前言 表现层经常会接受页面表单的数据,springmvc框架提供了封装javaBean的功能,但是针对一些特殊的属性,则不会自动封装(比如java.util.Date类型),需要我们自行绑定。这里介绍两种解决的办法:@InitBinder&amp;@DateTimeFormat() 2、@DateTimeFormat()绑定Date类型 @DateTimeFormat()实现数据的绑定比...

static_coder的博客 3030

Jackson 序列化 / 反序列化注解 完整版笔记

Jackson 序列化 / 反序列化注解 完整版笔记

handsome_sai的博客 278

训练数据示例

针对“规格书生成测试用例脚本”的任务,在 LLaMA-Factory 中使用即可。关键是把“规格书内容”放进input字段,把“期望的脚本输出”放进output字段。

liuxs2009的专栏 59
上一篇: XXL-JOB:揭秘定时机制
下一篇: 一天变Java大神?飞算AI工具颠覆编程界,程序员未来何去何从
智_永无止境
博客等级 码龄10年 803粉丝 404原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智_永无止境

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值