概要
这几天,我们的系统里连续出现了2个故障,故障原因很简单。我们在domain里平增了一个get方法,但是这个get方法并不是一般JAVA Bean里的getter/setter.
对这个domain进行JSON序列化时,jackson抛出了null pointer异常。
如果在Jackson序列化时将REQUIRE_SETTERS_FOR_GETTERS 设置为true,可以解决这个问题。
原因 && 解决方法
产生这个问题的根本原因是,以上的两个常见的JSON序列化工具在序列化domain时,会调用domain里的所有get方法。
解决这个事情的解决方法有很多
- 最好不要在domain里写复杂的处理逻辑
- 写public方法时,需要做非空校验
- 写的public方法换一个名字,不以get 开头
对于jackson来说,最好的解决方法是,给ObjectMapper增加一个配置
objectMapper.configure(SerializationConfig.Feature.REQUIRE_SETTERS_FOR_GETTERS, true);
REQUIRE_SETTERS_FOR_GETTERS 的说明
如果这个配置为false时,只有存在对应的构造器、setter或者field时,才调用getter。代码里的注释是
/** * Feature that determines whether getters (getter methods) * can be auto-detected if there is no matching mutator (setter, * constructor parameter or field) or not: if set to true, * only getters that match a mutator are auto-discovered; if * false, all auto-detectable getters can be discovered. *<p> * Feature is disabled by default for backwards compatibility * reasons. * * @since 1.9 */ REQUIRE_SETTERS_FOR_GETTERS(false),
测试代码
以上配置的测试代码是
public class JacksonTest extends TestCase{ private static ObjectMapper objectMapper; Foo foo = new Foo(); @Test public void testOriginMapper() throws Exception{ objectMapper = new ObjectMapper(); try { objectMapper.writeValueAsString(foo); failBecauseExceptionWasNotThrown(NullPointerException.class); } catch (Exception e) { assertThat(e).hasMessageContaining("NullPointerException"); } } @Test public void testNoGetter() throws Exception{ objectMapper = new ObjectMapper(); objectMapper.configure(SerializationConfig.Feature.REQUIRE_SETTERS_FOR_GETTERS, true); assertThat(objectMapper.writeValueAsString(foo)).isEqualTo("{\"name\":null,\"age\":null}"); } } class Foo { String name; Integer age; public String getName() { return name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getTrimName() { return name.trim(); } }
相关推荐
从任何case class创建一个Schema对象 将架构导出为JSON 直接使用模式对象进行有效的,并带有机器和人类友好的验证错误消息。 化为JSON。 这种方法比使用json4s序列化机制更快。 支持案例类,列表,字符串,日期,...
测试当前主流Json引擎的序列化与反序列化性能,包括JSON,FASTJSON,JACKSON and SMARTJSON。 Test the performance of the current mainstream engine,including JSON,FASTJSON,JACKSON and SMARTJSON JSON序列化...
主要介绍了Java实现Json字符串与Object对象相互转换的方式,结合实例形式总结分析了java基于Json-Lib、Org.Json、Jackson、Gson、FastJson五种方式转换json类型相关操作技巧,需要的朋友可以参考下
nfs-rpc是一个集成了各种知名通信框架的高性能RPC框架,目前其最好的性能为在采用grizzly作为通信框架,采用pb作为序列化/反序列化时,tps为168k次/秒。 其支持的功能主要为: 1、透明的调用远端服务器提供的功能...
nfs-rpc是一个集成了各种知名通信框架的高性能RPC框架,目前其最好的性能为在采用grizzly作为通信框架,采用pb作为序列化/反序列化时,tps为168k次/秒。 其支持的功能主要为: 1、透明的调用远端服务器提供的功能...
nfs-rpc是一个集成了各种知名通信框架的高性能RPC框架,目前其最好的性能为在采用grizzly作为通信框架,采用pb作为序列化/反序列化时,tps为168k次/秒。 其支持的功能主要为: 1、透明的调用远端服务器提供的功能...
nfs-rpc是一个集成了各种知名通信框架的高性能RPC框架,目前其最好的性能为在采用grizzly作为通信框架,采用pb作为序列化/反序列化时,tps为168k次/秒。 其支持的功能主要为: 1、透明的调用远端服务器提供的功能...
nfs-rpc是一个集成了各种知名通信框架的高性能RPC框架,目前其最好的性能为在采用grizzly作为通信框架,采用pb作为序列化/反序列化时,tps为168k次/秒。 其支持的功能主要为: 1、透明的调用远端服务器提供的功能...
nfs-rpc是一个集成了各种知名通信框架的高性能RPC框架,目前其最好的性能为在采用grizzly作为通信框架,采用pb作为序列化/反序列化时,tps为168k次/秒。 其支持的功能主要为: 1、透明的调用远端服务器提供的功能...
nfs-rpc是一个集成了各种知名通信框架的高性能RPC框架,目前其最好的性能为在采用grizzly作为通信框架,采用pb作为序列化/反序列化时,tps为168k次/秒。 其支持的功能主要为: 1、透明的调用远端服务器提供的功能...
nfs-rpc是一个集成了各种知名通信框架的高性能RPC框架,目前其最好的性能为在采用grizzly作为通信框架,采用pb作为序列化/反序列化时,tps为168k次/秒。 其支持的功能主要为: 1、透明的调用远端服务器提供的功能...
nfs-rpc是一个集成了各种知名通信框架的高性能RPC框架,目前其最好的性能为在采用grizzly作为通信框架,采用pb作为序列化/反序列化时,tps为168k次/秒。 其支持的功能主要为: 1、透明的调用远端服务器提供的功能...
nfs-rpc是一个集成了各种知名通信框架的高性能RPC框架,目前其最好的性能为在采用grizzly作为通信框架,采用pb作为序列化/反序列化时,tps为168k次/秒。 其支持的功能主要为: 1、透明的调用远端服务器提供的功能...
nfs-rpc是一个集成了各种知名通信框架的高性能RPC框架,目前其最好的性能为在采用grizzly作为通信框架,采用pb作为序列化/反序列化时,tps为168k次/秒。 其支持的功能主要为: 1、透明的调用远端服务器提供的功能...
Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...
nfs-rpc是一个集成了各种知名通信框架的高性能RPC框架,目前其最好的性能为在采用grizzly作为通信框架,采用pb作为序列化/反序列化时,tps为168k次/秒。 其支持的功能主要为: 1、透明的调用远端服务器提供的功能...
nfs-rpc是一个集成了各种知名通信框架的高性能RPC框架,目前其最好的性能为在采用grizzly作为通信框架,采用pb作为序列化/反序列化时,tps为168k次/秒。 其支持的功能主要为: 1、透明的调用远端服务器提供的功能...
密钥 Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存...
xml java系统源码 FUNTL FRAMEWORK 简介 Funtl Framework ...序列化与反序列化工具类 实现 Github Kaptcha 图形验证码 提供了基于 Sigar 跨平台的系统信息收集API,由C语言实现。可以收集的信息包括: CPU信