【BUG】已解决:JsonMappingException

已解决:JsonMappingException

欢迎来到英杰社区https://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序列化在整个应用中的行为

【其他错误】

如果出现模块错误

python 复制代码
进入控制台输入:建议使用国内镜像源

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/
相关推荐
量化投资技术6 分钟前
深入xtquant:掌握实时行情订阅的艺术
python·量化交易·量化·量化投资·qmt·miniqmt
m0_7482459214 分钟前
Python大数据可视化:基于spark的短视频推荐系统的设计与实现_django+spider
python·spark·django
网络安全Ash26 分钟前
Python网络安全脚本
开发语言·python·web安全
抽象具象化31 分钟前
BUG日志:使用热点或免费加速器时git链接github出现端口22拒绝访问的解决方法
git·github·bug
南太湖小蚂蚁1 小时前
自然语言处理入门2——神经网络
人工智能·python·深度学习·神经网络·自然语言处理
计算机毕设定制辅导-无忧学长1 小时前
Maven 插件的使用(一)
java·python·maven
m0_748248021 小时前
Python大数据可视化:基于大数据技术的共享单车数据分析与辅助管理系统_flask+hadoop+spider
大数据·python·信息可视化
m0_748256342 小时前
Python 入门教程(2)搭建环境 2.4、VSCode配置Node.js运行环境
vscode·python·node.js
pianmian12 小时前
python绘图之swarmplot分布散点图
开发语言·python
南瓜啊2 小时前
Django ORM 的常用字段类型、外键关联的跨表引用技巧,以及 `_` 和 `__` 的使用场景
python·django