2012-10-24 47 views
13

我正在運行Spring 3.1.2應用程序。我有一個有很多方法的RESTful servlet。 GET方法工作的很棒(@PathVariables匹配,響應正確編組爲JSON或基於Accept標頭的XML等)100%的時間。除非@RequestParam「required = false」,否則Spring不接受POST參數

但是,POST方法根本不起作用。經過幾個小時的轉換和其他春季方面的工作,我發現(所有修補都恢復了),我縮小了它的範圍,required字段@RequestParam。這是一個簡單的測試方法我一直在使用調查:

@RequestMapping (value = "/bogus", 
       method = POST) 
public @ResponseBody PassResponse bogus (
      @RequestParam (value = "test", required = false) String test) { 
    // Just some handy garbage objects that marshal to JSON/XML 
    UserResponse user = new UserResponse(); 
    user.setName (test); 
    AccountDetail detail = new AccountDetail (user,null); 
    return new PassResponse (detail); 
} 

需要=假:一切正常(參數接收和解釋)。正是我期望它的工作

必需=真:(或未指定,因爲這是默認的)我一直得到消息「MissingServletRequestParameterException:String類型,必需的參數‘測試’是不存在

客戶側視圖:

需要=真

Request URL:http://localhost:8080/internal-project/rest/bogus 
Request Method:POST 
Status Code:400 Bad Request 
Request Headersview source 
Accept:application/json 
Connection:keep-alive 
Content-Length:12 
Host:localhost:8080 
Request Payload 
test=LALALAA 
Response Headersview source 
Connection:close 
Content-Length:971 
Content-Type:text/html;charset=utf-8 
Date:Wed, 24 Oct 2012 18:41:05 GMT 
Server:Apache-Coyote/1.1 

需要=假

Request URL:http://localhost:8080/internal-project/rest/bogus 
Request Method:POST 
Status Code:200 OK 
Request Headersview source 
Accept:application/json 
Connection:keep-alive 
Content-Length:12 
Host:localhost:8080 
Request Payload 
test=LALALAA 
Response Headersview source 
Content-Type:application/json;charset=UTF-8 
Date:Wed, 24 Oct 2012 18:44:03 GMT 
Server:Apache-Coyote/1.1 
Transfer-Encoding:chunked 

切換required和我可以看到參數被傳遞時,它是完全相同的測試套件正在運行。當參數是可選的時,Spring會正確處理它。

如果有人遇到過這個或有任何想法,我很樂意聽到他們。將所需的參數標記爲可選參數,即使它有效,即使我評論它也是可怕的自我文檔。再加上這種行爲讓我有點緊張。希望我只是搞砸了某個地方...

回答

18

你的Content-Type頭應該是application/x-www-form-urlencoded我認爲。

+0

你是對的!按照您的建議設置「Content-Type」實際上會使映射行爲標準化。我不知道爲什麼'required'字段在我未能設置時觸發了分歧行爲,但這是一個小問題。感謝您的時間! – node42