2012-12-07 55 views
0

我已閱讀了StackOverflow上關於此問題的大多數帖子,並嘗試了許多修復程序,最終沒有任何最終解決我的問題。春天拋出HttpMediaTypeNotSupportedException: Content type 'application/json' not supportedAJAX JSON發佈到Spring控制器返回HTTP 415

我有一個像這樣定義一個控制器:

@RequestMapping(method = RequestMethod.POST, value = "/update") 
public @ResponseBody JSONDomainResponse update(@RequestBody Model inModel) 

在機型看起來就像這樣:

public class Model implements Serializable { 

private static final long serialVersionUID = 2738522159847487651L; 
private String id; 
private BigDecimal offset; 

@JsonCreator 
public Model(@JsonProperty("id") String id, @JsonProperty("offset") BigDecimal offset) { 
    this.id = id; 
    this.offset = offset; 
} 

public String getID() { 
    return id; 
} 

public BigDecimal getOffset() { 
    return offset; 
} 

public void setID(String id) { 
    this.id = id; 
} 

public void setOffset(BigDecimal offset) { 
    this.offset = offset; 
} 
} 

AJAX調用我試圖用看起來像這樣:

$.ajax({ 
    type : 'POST', 
    url : '/update', 
    contentType : "application/json", 
    data : JSON.stringify({"id":"test", "offset":300}) 
}); 

我有<mvc:annotation-driven/> configur在我的context.xml文件中,我已經驗證MappingJacksonHttpMessageConverter的canRead()方法對我的模型和JSON媒體類型返回true。

我也有我的classpath中指定的傑克遜核心和映射器罐。

我已經注意到,從控制器簽名中刪除模型參數使其實際上到達控制器與我的職位,這導致我相信我的模型有一些問題。因爲記錄的信息很少,所以我無法確定問題會出在哪裏。

在此先感謝。

回答

0

我終於找到了解決這個問題的辦法,這個辦法很平凡,但完全不明顯。

事實證明,我試圖反序列化的Model對象位於命名不正確的包中,當Spring無法找到模型時,它只是吞下生成的異常並返回false。我通過在Spring-MVC領域深入調試發現了這一點,特別是StdDeserializerProvider類。

對於其他人那裏收到此錯誤,我會強烈建議寫一些代碼來驗證什麼是此類情況的發生,例如:

@Test 
public void testThatCanConvertUpdateModel() { 
    MappingJacksonHttpMessageConverter conv = new MappingJacksonHttpMessageConverter(); 
    assertTrue(conv.canRead(YourModel.class, MediaType.APPLICATION_JSON)); 
}