Jackson无法序列化没有get, Set方法的POJO的解决方法

异常

重现代码

@Test

public void testObjectMapper() throws JsonProcessingException {

ObjectMapper objectMapper = new ObjectMapper();

Man man = new Man();

System.out.println(objectMapper.writeValueAsString(man));

}

public static class Man {

private int age;

private String name;

}

当 Jackson 遇到没有 getter, setter 方法的 POJO 时, 会抛出这个异常:

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

通过异常的说明, 可以知道原因是: 对于类 Man 没有找到序列化器, 并且没有发现有相应的属性来创建 BeanSerializer 序列化器.

解决

异常中, 也给出了一个解决方案: 禁用 SerializationFeature.FAIL_ON_EMPTY_BEANS:

objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);

通过源码, 可看到, 它默认是 true 的:

SerializationFeature.FAIL_ON_EMPTY_BEANS(true)

如果这样子配置了的话, 则像上面这种 Man 的 POJO, 它序列化出来的结果是 {} 开启反射时访问所有访问修饰符的字段:

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

像这样子的话, 就可以直接访问那些 private 字段, 而不需要 getter, setter 了. (不过, 没测试过这种情况下的 json 序列化性能, 如果对性能比较敏感的话, 请自行进行基准测试) 异常

com.fasterxml.jackson.databind.JsonMappingException: (was java.lang.NullPointerException) (through reference chain: )

有时, 我们在 pojo 里添加了一些自定义的方法, 但实际上它们并不是属于普通 bean 的 get/set 的, 这样子的话, 它就会报类似上面的异常了. 这时, 可以在相应的方法上, 加上@JsonIgnore 注解来忽略序列化它.免得让 Jackson 误认为它是 getter/setter 的方法.

相关推荐

  • 信息化和数字化的本质区别是什么?
  • 用自研 Pingora 替代 Nginx 后,Cloudflare 成为了最受欢迎 Web 服务器
  • 44.7 GB !遭前雇员“叛变”,俄版百度 Yandex 几乎所有源代码泄露
  • 火速报名!第二届湾区金融科技高校分论坛本周六开幕!金融科技产学研助力新时代 | Q推荐
  • 寒冬未散,手里没点“必杀技”,怎么翻过浪浪山? | 展望数据库工程师的 2023
  • 空降进阿里的 P10 都是什么人 | 极客时间
  • 动态线程池,真香!
  • 阿里达摩院发布2023十大科技趋势,你能看懂哪一个?
  • 连中两篇WWW顶会,我的经验分享!
  • 基于字节码的统一异常上报实践
  • 美将军称2025年与中国开战;女子剪掉丈夫下体被行拘10日罚200元;四川生育登记取消结婚限制及生育数量限制...|酷玩日爆
  • 应聘婴儿 | 每日一冷
  • 特斯拉真正的隐忧
  • 美国要过苦日子了?
  • KN95口罩价格恢复正常,可囤!
  • 四川生育登记取消结婚限制;美司法部:拜登和特朗普“文件门”调查如期进行;澳大利亚小型放射性胶囊丢失超过5天 | 每日大新闻
  • 以色列军队很强?骗哥们可以,别把自己也骗了
  • 代码影响范围工具探索
  • 实现10倍应用性能提升的10个技巧
  • 诞生不到半年,英特尔停止开发RISC-V Pathfinder项目