2013-07-22 69 views
9

這似乎是一個常見問題。我已經完成了所有在SO中給出的答案,但無法使其工作。
我正在嘗試將Spring MVC + Freemarker集成到已有的Web應用程序中。它適用於GET請求,並且Freemarker模板讀取Controller提供的Java對象時沒有任何問題。
但表單提交無法擊中控制器方法。最後我做了log4j的工作。這裏是我得到的錯誤:
錯誤Spring MVC:Error 400客戶端發送的請求在語法上不正確

HandlerMethod details: 
    Controller [application.entry.controller.UserController] 
    Method [public void application.entry.controller.UserController.handleSave(java.lang.String)] 

    org.springframework.web.bind.MissingServletRequestParameterException: 
Required String parameter 'action' is not present 


Freemarker的:

<form method="POST" action="save.html"> 
    ------------ 
    <input type="submit" class="btnnew" name="saveWithoutValidation" value="Save Without Validation"></input> 
    <input type="submit" class="btnnew" name="submit" value="Submit"></input> 
</form> 

上下文根是PORTAL
爲spring-servlet.xml

<bean id="viewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver"> 
     <property name="cache" value="true"/> 
     <property name="prefix" value=""/> 
     <property name="suffix" value=".ftl"/> 

的web.xml

<servlet> 
     <servlet-name>spring</servlet-name> 
     <servlet-class> 
      org.springframework.web.servlet.DispatcherServlet 
     </servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>spring</servlet-name> 
     <url-pattern>/</url-pattern> 
    </servlet-mapping> 

控制器

@RequestMapping(value="/save", method=RequestMethod.POST) 
    public void handleSave(@RequestParam String action){ 

     if(action.equals("submit")){ 
      System.out.println("Damn! You clicked submit"); 
     } 
     else if(action.equals("saveWithoutValidation")){ 
      System.out.println("Sweet! You want no string attached."); 
     } 

    } 

因爲我已嘗試添加log4j.logger.org.springframework.web=DEBUG我現有的log4j的日誌.pr operties但它沒有奏效。

回答

11

我也有這個問題,我的解決方案是不同的,所以在這裏添加任何有類似問題的人。

我的控制器有:

@RequestMapping(value = "/setPassword", method = RequestMethod.POST) 
public String setPassword(Model model, @RequestParameter SetPassword setPassword) { 
    ... 
} 

的問題是,這應該是@ModelAttribute的對象,而不是@RequestParameter。此錯誤消息與您在問題中描述的相同。

@RequestMapping(value = "/setPassword", method = RequestMethod.POST) 
public String setPassword(Model model, @ModelAttribute SetPassword setPassword) { 
    ... 
} 
+2

'@ ModelAttribute'會工作,因爲它也結合了請求註解目標。 '@ RequestParam'然而更適合單獨綁定請求參數。 – Bart

0

您的請求映射爲/save,但您的POST爲/save.html。將POST更改爲/save應該可以修復它。

+0

其實'/ save'給了我404我也試着用'<形式方法=「POST」動作=「保存」>'但同樣的錯誤。 –

0

請保持您的

<form method="POST" action="XYZ"> 


@RequestMapping(value="/XYZ", method=RequestMethod.POST) 
    public void handleSave(@RequestParam String action){ 

您的表單action屬性值必須匹配@RequestMapping的值,使得Spring MVC的可以解決這個問題。

另外,正如你所說的,在改變之後給404,爲此,你可以檢查控件是否在handleSave()方法內部輸入。

我認爲,因爲你沒有從handleSave()方法返回任何東西,你必須看看它。

如果它仍然不起作用,您可以請張貼您的春天日誌。

此外,請確保您的請求應該來像

/PORTAL /保存

如果有喜歡的PORTAL/JSP /保存在@RequestMapping提(值之間的任何=「/ JSP /保存「)

+0

發現錯誤,但不知道如何解決它。 –

+0

如果您能分享錯誤原因,這將有助於幫助其他面臨類似錯誤的人。 – Jayesh

+0

我在我的問題中添加了異常。但不知道如何解決它。 –

1

基於該誤差:

Required String parameter 'action' is not present 

需要有在請求名爲action存在的請求參數爲Spring映射請求您的處理者handleSave

您粘貼的HTML不顯示此類參數。

12

@RequestParam String action表明在請求中存在一個參數,其名稱爲動作您的表單中不存在該參數。您必須:

  1. 提交名爲的值參數值例如, <input name="action" />
  2. @RequestParam例如@RequestParam內設置所需的參數爲false@RequestParam(required=false)
1

控制器試圖在bean中查找「action」值,但根據您的示例,您沒有設置任何bean名稱「action」。 嘗試做名稱=「動作」。 @RequestParam總是在bean類中找到。

3

我正面臨類似的問題,發現像Date這樣的幾個字段沒有得到一個具體的值,一旦給定的值工作正常。請確保您的表格上沒有日期或其他字段,需要具體價值。

+0

這對我來說是個問題。我只是假設Spring會處理日期字段的空值,但我猜不是嗎? – Rick

0

@CookieValue(值= 「ABC」,需要=真)串m

當從真改需要假I,它的工作。

8

另一個可能的原因是RequestMapping屬性的順序錯誤。 隨着春天的醫生說:

An @RequestMapping handler method can have a very flexible signatures. The supported method arguments and return values are described in the following section. Most arguments can be used in arbitrary order with the only exception of BindingResult arguments. This is described in the next section.

如果向下滾動的文檔,你會看到BindingResult具有典型的屬性後成爲immediatelly,因爲我們可以有每個請求的多個模型對象,從而多個綁定

The Errors or BindingResult parameters have to follow the model object that is being bound immediately as the method signature might have more than one model object and Spring will create a separate BindingResult instance for each of them so the following sample won’t work:

這裏有兩個例子:

Invalid ordering of BindingResult and @ModelAttribute.

@RequestMapping(method = RequestMethod.POST) public String processSubmit(@ModelAttribute("pet") Pet pet, Model model, BindingResult result) { ... } Note, that there is a Model parameter in between Pet and BindingResult. To get this working you have to reorder the parameters as follows:

@RequestMapping(method = RequestMethod.POST) public String processSubmit(@ModelAttribute("pet") Pet pet, BindingResult result, Model model) { ... }

0

我的問題是我的模型ATT後缺乏BindingResult參數ribute。

@RequestMapping(method = RequestMethod.POST, value = "/sign-up", consumes = "application/x-www-form-urlencoded") 
    public ModelAndView registerUser(@Valid @ModelAttribute UserRegistrationInfo userRegistrationInfo 
           HttpServletRequest httpRequest, 
           HttpSession httpSession) { ... } 

後,我加入BindingResult我的控制器成爲

@RequestMapping(method = RequestMethod.POST, value = "/sign-up", consumes = "application/x-www-form-urlencoded") 
    public ModelAndView registerUser(@Valid @ModelAttribute UserRegistrationInfo userRegistrationInfo, BindingResult bindingResult, 
           HttpServletRequest httpRequest, 
           HttpSession httpSession) { ..} 

檢查答案@sashok_bg @sashko_bg MERSI mnogo

相關問題