Spring MVC:错误400客户端发送的请求在语法上是不正确的

时间:2013-07-22 16:05:06

标签: java spring spring-mvc

这似乎是一个常见问题。我已经完成了SO中给出的所有答案,但无法使其正常工作。
我正在尝试将Spring MVC + Freemarker集成到现有的Web应用程序中。它适用于GET请求,Freemarker Template读取Controller提供的java对象,没有任何问题 但表单提交无法触及Controller方法。最后我让log4j工作了。这是我得到的错误:
错误

    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>

context-root是 PORTAL 弹簧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.properties中,但它不起作用。

11 个答案:

答案 0 :(得分:12)

@RequestParam String action表示请求中存在一个名称为 action 的参数,该参数在您的表单中不存在。你必须:

  1. 提交名为 value 的参数,例如<input name="action" />
  2. false内将所需参数设置为@RequestParam,例如@RequestParam(required=false)

答案 1 :(得分: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 :(得分:8)

另一个可能的原因是RequestMapping属性的顺序错误。 正如春季医生所说:

  

@RequestMapping处理程序方法可以具有非常灵活的签名。   支持的方法参数和返回值在中描述   以下部分。 大多数参数可以按任意顺序使用   BindingResult参数的唯一例外。这在中描述   下一节。

如果向下滚动文档,您将看到BindingResult必须立即在模型属性之后,因为每个请求可以有多个模型对象,因此可以有多个绑定

  

错误或BindingResult参数必须遵循模型对象   正如方法签名可能具有的那样立即绑定   不止一个模型对象和Spring将创建一个单独的   每个BindingResult实例,所以下面的示例不会   工作:

以下是两个例子:

  

BindingResult和@ModelAttribute的排序无效。

     

@RequestMapping(method = RequestMethod.POST)public String   processSubmit(@ModelAttribute(&#34; pet&#34;)Pet pet,Model model,   BindingResult result){...}注意,中有一个Model参数   在Pet和BindingResult之间。为了使这个工作你必须重新排序   参数如下:

     

@RequestMapping(method = RequestMethod.POST)public String   processSubmit(@ModelAttribute(&#34; pet&#34;)宠物宠物,BindingResult结果,   模型模型){...}

答案 3 :(得分:3)

我遇到了类似的问题,发现像Date这样的一些领域并没有得到具体的价值,一旦给出了价值观可行的话。请确保您的表单上没有日期或任何其他需要具体值的字段。

答案 4 :(得分:1)

基于错误:

Required String parameter 'action' is not present

Spring请求中需要有一个名为action的请求参数,以将请求映射到处理程序handleSave

您粘贴的HTML没有显示此参数。

答案 5 :(得分:1)

控制器试图在bean中找到“action”值,但根据你的例子,你没有设置任何bean名称“action”。 尝试做name =“action”。 @RequestParam总是在bean类中找到。

答案 6 :(得分:0)

您的请求映射为/save,但您的POST是/save.html。将POST更改为/save应修复它。

答案 7 :(得分:0)

请保留

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


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

您的表单操作属性值必须与@RequestMapping的值匹配,以便Spring MVC可以解析它。

另外,正如您所说的那样,在更改后给出了404,为此,请检查控件是否进入handleSave()方法。

我认为,因为你没有从handleSave()方法返回任何东西,你必须看一下。

如果它仍然不起作用,请你发布春季日志。

另外,请确保您的请求应该是

/门户网站/保存

如果在PORTAL / jsp之间有什么东西/在@RequestMapping中保存提及(value =“/ jsp / save”)

答案 8 :(得分:0)

@CookieValue(value =“abc”,required = true)String m

当我将要求从true更改为false时,它就成功了。

答案 9 :(得分:0)

我的问题是我的模型属性后缺少BindingResult参数。

 @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

答案 10 :(得分:0)

在您的方法中添加BindingResult参数。作为参考,请在下面输入我的代码。

save(@ModelAttribute Employee employee,BindingResult bindingResult)