2012-08-11 51 views
0

我有一個類層次結構。它的頂部有一個抽象的AnswerUnit類。有兩個繼承類:OpenQuestionAnswer和MultipleChoiceQuestionAnswer。@ResponseBody +繼承Spring MVC + JSON

我有一個.jsp表單發送數據(對象序列化爲JSON)到服務器與AJAX請求和控制器中的方法來處理它。

@RequestMapping(value = "/test", method = RequestMethod.POST) 
    public @ResponseBody 
    String testPostMethod(@RequestBody 
    OpenQuestionAnswer answer) { 
     return "home"; 
    } 

我希望能夠採取「AnswerUnit回答」作爲參數(抽象類型,而不是具體類型,這樣我就可以從不同的角度處理請求的一個方法)。當我嘗試這樣做有一個問題 - 服務器respose是

400 BAD REQUEST he request sent by the client was syntactically incorrect.

我認爲,原因是春季(傑克遜?)是不是能夠找出具體的類,他應該創建和使用。 在客戶端,我知道我發送到服務器的類是什麼類。 什麼是正確的方式告訴服務器應該創建哪個具體類並填充我的請求?

+0

在你的示例中,你已經展示了一個具體的類型 - 「OpenQuestionAnswer」,即使使用具體類型,你是否得到了這個錯誤?你可以嘗試降低日誌級別DEBUG,看看是否有其他東西顯示 – 2012-08-11 15:08:24

+0

似乎很明顯,但你是否在你的JSON POST中引用方法到你的具體類(不能認爲沒有看到代碼)?你可能不得不放棄繼承,並用組合來代替(http://stackoverflow.com/questions/2399544/difference-between-inheritance-and-composition) – nickdos 2012-08-12 06:11:14

回答

2

我想我有反應來晚了,但無論如何:)

http://wiki.fasterxml.com/JacksonAnnotations

您可以使用此傑克遜多態型搬運

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type") 
@JsonSubTypes(value = { 
    @JsonSubTypes.Type(name = "answer", value = OpenQuestionAnswer.class), 
    @JsonSubTypes.Type(name = "multiple", value = MultipleChoiceQuestionAnswer.class) 
}) 
public class AnswerUnit 
... 

但你需要添加「型「字段到您的客戶端JSON。

+1

太棒了!謝謝你o / – bosco 2017-08-08 20:29:23