当前位置: 首页 > news >正文

【BUG】已解决:JsonMappingException

已解决:JsonMappingException

欢迎来到英杰社区icon-default.png?t=N7T8https://bbs.csdn.net/topics/617804998

概述:

        没有getter方法的实体的序列化,并解决Jackson引发的JsonMappingException异常。

        默认情况下,Jackson 2只会处理公有字段或具有公有getter方法的字段。如果实体的所有字段都是私有或包内可见的,序列化将会失败:

public class MyDtoNoAccessors {String stringValue;int intValue;boolean booleanValue;public MyDtoNoAccessors() {super();}// no getters
}
@Test(expected = JsonMappingException.class)
public void givenObjectHasNoAccessors_whenSerializing_thenException() throws JsonParseException, IOException {String dtoAsString = new ObjectMapper().writeValueAsString(new MyDtoNoAccessors());assertThat(dtoAsString, notNullValue());
}

完整的异常如下:

com.fasterxml.jackson.databind.JsonMappingException: 
No serializer found for class dtos.MyDtoNoAccessors 
and no properties discovered to create BeanSerializer 
(to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) )

3.1. 全局自动检测任何可见性的字段

        对于这个问题的一个解决方案是全局配置ObjectMapper,使其检测所有字段,不论其可见性:

objectMapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);

        这将允许Jackson检测到没有getter方法的私有和包内可见字段,从而实现正确的序列化:

@Test
public void givenObjectHasNoAccessors_whenSerializingWithAllFieldsDetected_thenNoException() throws JsonParseException, IOException {ObjectMapper objectMapper = new ObjectMapper();objectMapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);String dtoAsString = objectMapper.writeValueAsString(new MyDtoNoAccessors());assertThat(dtoAsString, containsString("intValue"));assertThat(dtoAsString, containsString("stringValue"));assertThat(dtoAsString, containsString("booleanValue"));
}

3.2. 在类级别控制字段可见性

        Jackson 2还提供了另一种选择,即通过@JsonAutoDetect注解在类级别控制字段可见性:

@JsonAutoDetect(fieldVisibility = Visibility.ANY)
public class MyDtoNoAccessors { ... }

        使用这个注解,这个特定类的序列化现在应该可以正常工作:

@Test
public void givenObjectHasNoAccessorsButHasVisibleFields_whenSerializing_thenNoException() throws JsonParseException, IOException {ObjectMapper objectMapper = new ObjectMapper();String dtoAsString = objectMapper.writeValueAsString(new MyDtoNoAccessors());assertThat(dtoAsString, containsString("intValue"));assertThat(dtoAsString, containsString("stringValue"));assertThat(dtoAsString, containsString("booleanValue"));
}

4. 在Jackson中禁用fail_on_empty_beans

        在Jackson中,fail_on_empty_beans特性决定了在序列化过程中遇到空对象(没有属性)时是否抛出异常。默认情况下,Jackson会遇到空bean时抛出异常。

        值得注意的是,fail_on_empty_beans特性默认启用,若要禁用它,我们需要明确设置为false。具体方法取决于我们的具体用例。

4.1. 使用ObjectMapper配置

        可以直接在ObjectMapper上禁用fail_on_empty_beans

ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);

通过这种方式配置ObjectMapper,我们告诉Jackson在序列化过程中遇到空bean时不抛出异常。

4.2. 使用Spring Boot

        在Spring Boot中,我们可以在application.properties文件中设置以下属性以全局禁用fail_on_empty_beans

spring.jackson.serialization.FAIL_ON_EMPTY_BEANS=false

        这个属性可以在应用级别设置,以控制Jackson序列化在整个应用中的行为

   【其他错误】

如果出现模块错误

进入控制台输入:建议使用国内镜像源pip install 模块名称 -i https://mirrors.aliyun.com/pypi/simple我大致罗列了以下几种国内镜像源:清华大学
https://pypi.tuna.tsinghua.edu.cn/simple阿里云
https://mirrors.aliyun.com/pypi/simple/豆瓣
https://pypi.douban.com/simple/百度云
https://mirror.baidu.com/pypi/simple/中科大
https://pypi.mirrors.ustc.edu.cn/simple/华为云
https://mirrors.huaweicloud.com/repository/pypi/simple/腾讯云
https://mirrors.cloud.tencent.com/pypi/simple/

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 从零开始学习嵌入式---- C高级编译工具
  • FastAPI 学习之路(三十四)数据库多表操作
  • 基于术语词典干预的机器翻译挑战赛笔记Task1 跑通baseline
  • mybatis基础语法
  • springmvc-03
  • 《梦醒蝶飞:释放Excel函数与公式的力量》11.3 ISTEXT函数
  • Spark SQL 概述
  • 基于Python+Flask+MySQL的新冠疫情可视化系统
  • PostgreSQL 中如何处理数据的批量更新和事务日志管理?
  • OpenCV:python图像旋转,cv2.getRotationMatrix2D 和 cv2.warpAffine 函数
  • 分布式I/O从站的认知
  • 昇思25天打卡营-mindspore-ML- Day22-应用实践-自然语言处理-LSTM+CRF序列标注
  • Font Awesome 文本图标
  • 【大模型LLM面试合集】大语言模型架构_attention
  • 【密码学】大整数分解问题和离散对数问题
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • C++类的相互关联
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • Django 博客开发教程 8 - 博客文章详情页
  • Flex布局到底解决了什么问题
  • Java反射-动态类加载和重新加载
  • js
  • MySQL QA
  • python学习笔记-类对象的信息
  • Terraform入门 - 1. 安装Terraform
  • vue学习系列(二)vue-cli
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 关于for循环的简单归纳
  • 目录与文件属性:编写ls
  • 深度解析利用ES6进行Promise封装总结
  • 深度学习入门:10门免费线上课程推荐
  • 十年未变!安全,谁之责?(下)
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • 怎么将电脑中的声音录制成WAV格式
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • k8s使用glusterfs实现动态持久化存储
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • #pragma once与条件编译
  • #数学建模# 线性规划问题的Matlab求解
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (void) (_x == _y)的作用
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (二十六)Java 数据结构
  • (汇总)os模块以及shutil模块对文件的操作
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (七)Appdesigner-初步入门及常用组件的使用方法说明
  • (推荐)叮当——中文语音对话机器人
  • (微服务实战)预付卡平台支付交易系统卡充值业务流程设计
  • (一)80c52学习之旅-起始篇
  • (一)utf8mb4_general_ci 和 utf8mb4_unicode_ci 适用排序和比较规则场景
  • (一)VirtualBox安装增强功能