當發送一個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