当发送一个JSON以被Jackson反序列化时,似乎如果子元素的最后一个值是null
,Jackson将中止反序列化。杰克逊Deserialization当子属性的值为空值时终止
坏:
如果我这个JSON发送到我的接收器(如下图),映射Content
对象将是null
,因为反序列化停止在image
:
{"user":{"id":"1", "token":"ABC", "image":null},"content":{"id":"2"}}
好:
如果我把它像这样,image
仍将有null
值所需,但Content
对象将其ID创建:
{"user":{"id":"1", "image":null, "token":"ABC"},"content":{"id":"2"}}
这看起来像一个bug给我..?!
简单的接收器:
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
@Transactional
public Response create(UserContent source) {
UserContent dbResult = manager.create(source);
return Response.status(200)
.entity(dbResult.getId().toString()).build();
}
串行
public static String objectToString(Object object) {
ObjectMapper mapper = new ObjectMapper();
mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"));
Writer strWriter = new StringWriter();
try {
mapper.writeValue(strWriter, object);
} catch (Exception ex) {
throw new RuntimeException(ex);
}
String userDataJSON = strWriter.toString();
return userDataJSON;
}
可以设置我的ObjectMapper连载所有的null
作为我的发送方""
或空的对象?
如果我通过了null
财产上述方法UserContent
对象,生成的JSON将有null
值像上面的例子,应该在列表的最后一个项目的值为空,反序列化将中止会导致NullPointerExceptions我后端。
修改 - UserContent类:
@Entity
@Table(name = "user_content")
@XmlRootElement
public class UserContent extends org.springframework.data.jpa.domain.AbstractPersistable<Long> {
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id", nullable = false)
@Fetch(FetchMode.JOIN)
private User user;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "content_post_id", nullable = false)
@Fetch(FetchMode.JOIN)
private Contentcontent;
// more properties...
}
我们的依赖关系:
<properties>
<jersey-version>1.14</jersey-version>
</properties>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.5</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-server</artifactId>
<version>${jersey-version}</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-client</artifactId>
<version>${jersey-version}</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-json</artifactId>
<version>${jersey-version}</version>
</dependency>
<dependency>
<groupId>com.sun.jersey.contribs</groupId>
<artifactId>jersey-multipart</artifactId>
<version>${jersey-version}</version>
</dependency>
<dependency>
<groupId>com.sun.jersey.jersey-test-framework</groupId>
<artifactId>jersey-test-framework-grizzly2</artifactId>
<version>${jersey-version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-servlet</artifactId>
<version>${jersey-version}</version>
<scope>test</scope>
</dependency>
您错过了“UserContent”类的问题描述中最重要的部分。请添加它,这样可以解释或复制问题。另外,请包括使用的杰克逊版本。 – StaxMan
谢谢StaxMan,没想到那会很关键。编辑我的帖子。希望你可能知道该怎么做.. – Pete
任何其他杰克逊模块在使用?我也假设必须有吸气剂或吸附剂,因为私人领域没有被检测到。我所得到的只是再现问题。单元测试中包含类似的结构,所以应该对你的用例有一些特别的东西;我只是想着想什么可能是不同的。 – StaxMan