概要
这几天,我们的系统里连续出现了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(); } }
相关推荐
要使用Jackson库进行JSON序列化,你需要创建一个`ObjectMapper`实例,然后调用其`writeValueAsString()`方法。例如: ```java ObjectMapper mapper = new ObjectMapper(); MyObject obj = new MyObject(); String ...
Jackson是由FasterXML公司维护的一个高性能的JSON处理库,它提供了一整套完善的解决方案,包括流式API(JsonParser/JsonGenerator)、树模型API(JsonNode)以及对象映射API( ObjectMapper)。Jackson的优点在于其...
例如,当对象的某个属性可能不存在,但我们需要在序列化或反序列化时忽略它,可以使用`$`符号来引用。例如,`JSON.parseObject(json, new TypeReference, Object>>(){},{})`,这里的`{}`表示空的映射策略,意味着...
Jackson还支持注解驱动的映射,允许开发者通过注解来控制序列化和反序列化的具体行为。 这三个库各有特点,Fastjson以其速度和简洁性脱颖而出,Gson则以其灵活性和对复杂类型的处理能力受到青睐,而Jackson则在功能...
在Java中,可以使用`java.io.Serializable`接口标记一个类为可序列化的,然后使用`ObjectOutputStream`来序列化对象,而`ObjectInputStream`则用于反序列化。 在描述的"序列化与反序列化Demo"中,我们可以推测这...
Jackson是另一个广泛使用的Java JSON库,它提供了一套完整的解决方案,包括流式API、树模型API和注解驱动的映射API: ```java // 序列化 ObjectMapper mapper = new ObjectMapper(); String jsonString = mapper....
- 使用`ObjectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL)`可以避免序列化时包含null值,提升性能。 ### 异常处理 在序列化和反序列化过程中可能会遇到错误,例如类型不匹配、字段缺失等。...
在"TestJson"这个例子中,可能包含了一个或多个测试用例,用于检验JSON反序列化的正确性。这可能是一个简单的JSON字符串,或者是一个包含复杂嵌套结构的JSON对象。开发者通常会编写测试代码,模拟从服务器获取JSON...
在Java中,`java.io.Serializable`接口用于标记一个类是可序列化的。然而,Java标准库提供的序列化机制效率较低且安全性欠佳,因此出现了许多第三方框架来优化这一过程。本篇将介绍几个常用的Java序列化和反序列化...
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,已经成为了广泛使用的数据序列化和反序列化的格式之一。 跨平台支持:JSON可以被多种编程语言解析和生成,可以在不同的平台和语言之间进行数据交换...
Java中的JSON(JavaScript Object Notation)序列化与反序列化是开发过程中常见且重要的操作,主要用于数据交换和存储。JSON是一种轻量级的数据交换格式,它允许我们将Java对象转换为JSON字符串,反之亦然,方便在...
在Java中,如果一个类需要支持序列化,那么这个类就需要实现`java.io.Serializable`接口,尽管该接口没有任何方法需要实现,但它的存在就标志着这个类的对象可以被序列化。 首先,我们来看一下`SerializableDemo`这...
在Java开发中,JSON(JavaScript Object Notation)是一种广泛使用的轻量级数据交换格式,它易于人阅读和...在处理涉及货币数据的RESTful服务、微服务通信或任何需要JSON序列化的场景下,它都是一个非常实用的工具。
- **Jackson**:它是一个快速、功能丰富的JSON库,提供了多种方式(如JsonNode、POJO、流API等)处理JSON数据,同时支持JSON序列化和反序列化。 - **Gson**:Google开发的库,能够直接将Java对象转换为JSON字符串...
在Java世界里,为了方便地进行JSON的序列化(将Java对象转换为JSON字符串)和反序列化(将JSON字符串转换回Java对象),有多个库提供了强大的支持,其中包括Gson、Jackson、Fastjson以及LoganSquare。接下来,我们将...
- 除了Java内置的序列化机制,还可以使用JSON(JavaScript Object Notation)进行序列化,例如Gson、Jackson和Fastjson等库,它们能将Java对象转换成JSON字符串,方便在网络间传输,并且更易于人类阅读。...
Jackson-all-2.8.0.jar是这个压缩包中的核心文件,它是Jackson库的一个综合包,包含了序列化、反序列化、流式处理等各种功能的实现。通过引入这个JAR文件,开发者可以直接在Spring MVC 4.3框架中使用Jackson提供的...
它包含`ObjectMapper`类,这是一个强大的工具,可以方便地处理JSON序列化和反序列化任务,支持各种配置选项和转换策略。 2. **jackson-core-2.9.0.jar**:这个模块提供了JSON解析和生成的基础功能,包括流式API...
但是,如果我们有一个Map对象,即使我们对ObjectMapper对象进行了相同的设置,Map对象中键值对的值为null时,这个键值对还是会被包含在序列化的JSON中。 总结来说,通过以上两种方法,我们可以轻松地控制在使用...
除了基本的序列化和反序列化功能,Jackson还支持多种高级特性,比如自定义序列化器和反序列化器、处理复杂数据结构等。对于需要处理JSON数据的Java开发者来说,熟练掌握Jackson是非常有必要的。