2011-05-04 269 views
7

夥計們,好吧,我已經做了足夠的研究,但仍無法找到解決方案。將@RequestBody轉換爲對象

簡而言之,我只是將url編碼的表單數據傳遞給Controller方法,並試圖將其轉換爲具有Date和整數的域對象。

@RequestMapping(value = "/savePassport", method = RequestMethod.POST) 
    public @ResponseBody 
    AjaxResponse savePassport(@RequestBody StaffPassport passport, HttpServletResponse response) { 

    // Some operations. 

}

工作人員護照看起來是這樣的:

import java.sql.Date; 

public class StaffPassport { 

    private int staffId; 
    private String passportNumber; 
    private String placeOfIssue; 
    private Date issueDate; 
    private Date expiryDate; 
    private String spouseName; 
    private String oldPassportRef; 
    private String visaInfo; 
    private String description; 
//gets/sets 
} 

當我調用/ savePassport,我得到不支持的媒體異常。我想這與鑄造有關。

我不能這個工作的權利。當然,我可以使用@RequestParam捕捉單獨的表單數據並手動執行轉換,但這不是框架的重點,不是嗎?

我哪裏錯了?你說得對。我是春季初學者,但我喜歡它。

+0

好問題,ResponseBody運行良好,但沒有人知道如何讓RequestBody自動綁定到一個bean?這很奇怪... – 2011-05-08 23:06:42

回答

9

看起來像是使用了錯誤的註釋。 @RequestBody用於接受任意內容的請求,如JSON,某些應用程序定義的XML,逗號分隔變量等等。並使用您在調度程序servlet中配置的編組器將其變爲對象。

如果您要做的只是要求Spring將簡單的舊錶單帖子綁定到支持對象上,那麼放在方法參數上的正確註釋是@ModelAttribute

+0

我不使用基於彈簧的表格,使用。我只是通過序列化窗體並調用控制器方法來使用ajax調用。我也嘗試過使用@ModelAttribute。但是,再次,似乎有一些問題與日期鑄造我猜。如果有任何特殊配置需要完成,您可以請教建議嗎? – 2011-05-04 23:34:22

+0

完成工作的類是WebDataBinder。手動完成它會很痛苦,因爲有很多配置進入它。 – Affe 2011-05-04 23:40:46

+0

對於java.sql.Date,沒有默認的屬性編輯器。您需要註冊您自己的屬性編輯器,以使用@InitBinder將字符串轉換爲日期。 – Affe 2011-05-04 23:43:36

0

首先確保你在Spring配置文件中有

<mvc:annotation-driven /> 

。這對於在SPring MVC中使用JSOn是強制性的。

其次,我建議你測試一下服務器是否有application/json內容類型。我相信Fiddler2會幫助你這樣做。

第三,但我不確定,嘗試將POJO中的Date項從SQL類型更改爲常規Java類型。

更新: 只是看着窗體,它看起來像你的「接受」HTTP頭應該也是application/json。請使用Fiddler2來測試這個問題。

0

我假設你正在發佈JSON並希望Spring將其轉換爲StaffPassport。如果您得到不受支持的媒體異常,那是因爲Spring無法找出執行轉換的適當方式。

對於Spring來轉換JSON,它需要Jackson - 確保你的項目中有Jackson jar。如果這是一個基於Maven的項目,您可以將jackson-mapper-asl工件標識添加到您的pom.xml中。這應該給你傑克遜映射器和傑克遜核心罐。

編輯:我應該提到,這適用於Spring 3(我最近碰到這個問題)。我不確定以前版本的Spring還需要什麼。

0

檢入HttpMessageConverter接口及其實現。您可以編寫自己的實現將其轉換爲您想要的域模型。當控制權到達您的方法時,您可以像訪問您的域模型對象一樣訪問它。

-1

好吧,我想我應該改進我的答案。我沒有在spring-mvc項目中使用它的直接經驗,但是彈簧整合。我非常確定,適用的媒體類型(application/x-url-form-encoded)已經被Spring框架處理並轉換爲MultiMap;因此,從其中像鍵值爲表單變量的任何其他地圖一樣檢索值,並填充您的業務模型。

HTH。

+0

請更新您的原始答案和任何澄清。 – kryger 2017-02-22 16:10:38

1

如果您使用jQuery發佈JSON對象,並希望Spring能夠使用@RequestBody處理它,請在數據中使用JSON.stringify(....)。下面一個例子:

var data = { "id": 3, "name": "test" } 
$.post("processJsonData.html",JSON.stringify(data), function(data){ 
    ... 
    } 
); 

如果不使用JSON.stringify(),那麼你將提交數據的表單數據和Spring會告訴你,你有不支持的媒體類型。