fastjson与lombok一起用出现序列化问题

news2025/1/11 18:31:41

文章内部信息已脱敏。

有一次在测试环境调用网易电子签章平台的接口,用来生成印章图片。

首先用postman去测试接口,除了必传的固定请求头,请求体参数如下:

{
    "userId": "***********",
    "templateType": "STAR",
    "color": "RED",
    "hText": "合同专用章",
    "qText": "2023-01-17"   
}

返回的结果是印章图片的base64。转化为图片后是。
在这里插入图片描述

然后在java项目里去调用该接口,用了feign去调第三方平台接口。

但是发现返回的base64转化为图片后,始终是如下图,也就是传入的参数中hText(横向文)与qText(下旋文),这两个字段没有生效。

在这里插入图片描述

代码中的对象属性定义为:

@Builder
@AllArgsConstructor
@NoArgsConstructor
@Data
@Accessors(chain = true)
public class EsignAddSealDTO {

    private String userId;

    private String templateType;

    private String color;

    private String hText;

    private String qText;
  }

仔细检查了代码,发现对象属性之类的代码并没有问题,那为什么这两个字段会没有生效呢?

由于postman接口可以返回正确的结果,并且java项目调用中也有返回,可以定位到还是传参对象出了问题。

EsignAddSealDTO req = EsignAddSealDTO.builder().userId("*************").templateType("STAR").color("RED")
        .hText("合同专用章").qText("2023-01-17").build();
System.out.println(JSONObject.toJSONString(req));

打印传参对象的json字符串,发现结果为:

{"HText":"合同专用章","QText":"2023-01-17","color":"RED","templateType":"STAR","userId":"*************"}

!! 序列化的json库采用的是fastjson,序列化后的json字符串中hText和qText竟然属性名首字母变为了大写。怪不得这两个字段没有生效。

项目中的fastjson版本是2.0.9。

看一下原因,首先,使用了lombok的@Data注解之后,默认生成的hText属性的get方法名变为了getHText(), qText属性的get方法名变为了getQText()。

而在fastjson中,获取属性名的方法是com.alibaba.fastjson2.util.BeanUtils#getterName。
源码debug如下:

其中mthodName入参为“getQText”,namingStrategy传参为null, 方法中修改设值为“CamelCase”。
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

这边可以看到源码中,对于get开头的方法名,如getQText,首先取get后的字符串为chars, 这里chars就是[Q, T, e, x, t]。

chars首字母为Q, 这时候做判断,如果第二个字符为大写,则直接返回chars为属性名;如果第二个字符为小写,则将首字母变为小写,再返回。这里由于第二个字符为T,因此这里直接返回QText为属性名。

再举例:如果方法名是getUserId,取chars为[U, s, e, r, I, d], 取首字母为U,因为第二个字符为小写,因此将首字母变为小写,返回userId为属性名。

因此getQText方法得到的属性名就是QText。而不是类定义的属性名qText。

知道原因后,就简单了,可以不使用lombok,而是直接生成get/set方法,

public String gethText() {
    return hText;
}

public void sethText(String hText) {
    this.hText = hText;
}

public String getqText() {
    return qText;
}

public void setqText(String qText) {
    this.qText = qText;
}

就可以返回正确属性名了。

注意:

使用@Data注解,即使在属性hText、qText上加上@JsonProperty注解,依旧不起作用。但是加在其他属性上时生效的,如在color上加注解,可以修改序列化后的属性名。

@Data
@Builder
public class EsignAddSealDTO {

    private String userId;

    private String templateType;

    @JsonProperty(value = "COLOR")
    private String color;

    @JsonProperty(value = "hText")
    private String hText;

    @JsonProperty(value = "qText")
    private String qText;

}

生成的序列化json字符串为:

{"COLOR":"RED","HText":"合同专用章","QText":"2023-01-17","templateType":"STAR","userId":"*************"}

附录: 浏览源码顺序:
com.alibaba.fastjson.JSON#toJSONString(java.lang.Object)
com.alibaba.fastjson2.JSONWriter.Context#getObjectWriter(java.lang.reflect.Type,java.lang.Class)
com.alibaba.fastjson2.writer.ObjectWriterProvider#getObjectWriter(java.lang.reflect.Type,
java.lang.Class, boolean)
com.alibaba.fastjson2.writer.ObjectWriterCreatorASM#createObjectWriter
com.alibaba.fastjson2.util.BeanUtils#getterName

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/580407.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据在内存中是如何存储的?(上)

C语言进阶——数据在内存中是如何存储的? 一. 整型数据的二进制表示二.数据类型详细介绍1.1 类型的基本归类1.2认识有无符号的区别( signed 和 unsigned )1.3代码理解一:1.4代码二理解:1.5代码三理解:1.6代…

【P40】JMeter 录制控制器(Recording Controller)

文章目录 一、录制控制器(Recording Controller)二、准备工作三、测试计划设计 一、录制控制器(Recording Controller) 可以理解为一个占位符,用来告诉代理服务器将脚本录制到何处,本身无任何逻辑作用&…

AI时代来临,新时代程序员如何紧追时代的风口浪尖?

文章目录 背景AI时代的背景和机遇抓住AI时代的机遇新时代程序员的技能和素质实践建议和资源总结 背景 在这个快速发展的AI时代,程序员们正置身于科技革新的前沿。随着人工智能技术的蓬勃发展和广泛应用,程序员的作用变得愈发重要和关键。他们不再是简单…

Doris之rollup上卷及物化视图

Rollup上卷 通过建表语句创建出来的表称为 Base 表(Base Table,基表) 在 Base 表之上,我们可以创建任意多个 ROLLUP 表。这些 ROLLUP 的数据是基于 Base 表产生的,并且在物理上是独立存储的。 Rollup表的好处: 和基表…

如何在华为OD机试中获得满分?Java实现【最长的连续子序列】一文详解!

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: Java华为OD机试真题(2022&2023) 文章目录 1. 题目描述2. 输入描述3. 输出描述…

如何在华为OD机试中获得满分?Java实现【滑动窗口】一文详解!

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: Java华为OD机试真题(2022&2023) 文章目录 1. 题目描述2. 输入描述3. 输出描述…

软件测试理论----接口测试中restful接口状态码规范

一、restful接口状态码总体分类 类别描述1xx:信息通信传输协议信息2xx:成功表示客户端的请求已成功接受3xx:重定向表示客户端必须执行一些其他操作才能完成其请求4xx:客户端错误此类错误状态码指向客户端5xx:服务器错…

在SPSS Statistics中使用R(插件)

date: 2018-10-30 09:26:33 在SPSS中使用R(插件) 谷歌或者百度“SPSS中调用R”, 最详细也是最靠谱的就是IBM SPSS社区的这两篇文章: https://www.ibm.com/developerworks/cn/data/library/ba/ba-1401spss-r/https://www.ibm.com/developerworks/cn/ana…

基于Open3D的点云处理6-点云去噪

当我们从扫描设备获取点云数据时,数据会包含噪声和伪影,点云噪声特性包括不真实的点、孤立点、不规则,基于噪声特性对器进行去除; 统计滤波 Statistical Outlier Removal(SOR)(去除离群点&…

【JVM】13. 垃圾回收器

文章目录 13.1. GC分类与性能指标13.1.1. 垃圾回收器概述13.1.2. 垃圾收集器分类13.1.3. 评估GC的性能指标吞吐量暂停时间吞吐量 vs 暂停时间 13.2. 不同的垃圾回收器概述13.2.1. 垃圾回收器发展史13.2.2. 7种经典的垃圾收集器13.2.3. 7款经典收集器与垃圾分代之间的关系13.2.4…

前端自动化测试 —— Jest 测试框架应用

目录​​​​​​​ 什么是自动化测试 为什么要用前端自动化测试 前端自动化分类和思想 单元测试 集成测试 TDD 测试驱动开发(Test Driven Development) BDD 行为驱动开发(Behavior Driven Development) 如何自己写非框架…

分布式软件架构——SOA架构/微服务架构/无服务架构

SOA架构 Service-Oriented Architecture,面向服务的架构。面向服务的架构是一次具体地、系统性地成功解决分布式服务主要问题的架构模式。了解SOA架构前,先了解三种比较有代表性的服务拆分的架构模式,这些架构模式是SOA演化过程的中间产物&a…

偷偷曝光下国内这些软件外包公司!(2023 最新版)

ChatGPT狂飙160天,世界已经不是之前的样子。 我新建了人工智能中文站https://ai.weoknow.com 每天给大家更新可用的国内可用chatGPT资源 根据网上的资料,整理出来的一份国内软件外包公司的名单。 找工作的同学都要看看,根据自身的情况&#…

杰理AC632N实现custom hid

1. 设备描述符修改 设备描述符主要修改的是PID、VID、设备发现版本号以及字符串描述。 static const u8 sDeviceDescriptor[] { //<Device DescriptorUSB_DT_DEVICE_SIZE, // bLength: Size of descriptorUSB_DT_DEVICE, // bDescriptorType: Device #if defi…

langchain简版教程附案例

简介 LangChain是一个开源的应用开发框架。基于该开源框架&#xff0c;我们可以把大模型与各种工具结合从而实现各种功能&#xff0c;比如基本文档的问答&#xff0c;解析网页内容、查询表格数据等。目前支持Python和TypeScript两种编程语言。当前Python框架支持的模型和功能最…

腾讯云服务器ping不通解决方法(公网IP/安全组/系统多维度)

腾讯云服务器ping不通什么原因&#xff1f;ping不通公网IP地址还是域名&#xff1f;新手站长从云服务器公网IP、安全组、Linux系统和Windows操作系统多方面来详细说明腾讯云服务器ping不通的解决方法&#xff1a; 目录 腾讯云服务器ping不通原因分析及解决方法 安全组ICMP协…

智能计价器-第14届蓝桥杯省赛Scratch中级组真题第5题

[导读]&#xff1a;超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成&#xff0c;后续会不定期解读蓝桥杯真题&#xff0c;这是Scratch蓝桥杯真题解析第140讲。 智能计价器&#xff0c;本题是2023年5月7日举行的第14届蓝桥杯省赛Scratch图形化编程中级组真题第5题&#…

楼宇租赁管理系统-什么是楼宇租赁系统

楼宇租赁管理系统是一种综合管理平台&#xff0c;它为不同规模楼宇的租赁管理提供了全面的解决方案。楼宇租赁管理系统的主要功能包括租赁管理、财务管理、维修管理、报告管理以及客户服务管理等。让我们逐一介绍每一个功能点。 一、租赁管理 楼宇租赁管理系统通过集成租户信息…

路径规划算法:基于群居蜘蛛优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于群居蜘蛛优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于群居蜘蛛优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化…

博学谷学习记录】超强总结,用心分享 | 架构师 MySQL调优MVCC学习总结

文章目录 1 概述2 快照读与当前读当前读快照读隔离级别&#xff1a;undo log版本链&#xff1a; 3 Read View3.1 什么是Read View?3.2 实现原理3.3 Read View规则&#xff08;可见性算法&#xff09; 4 MVCC整体流程4.1 可重复读是如何工作的&#xff1f;4.2 读提交是如何工作…