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

Him*_*dav 9 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
Run Code Online (Sandbox Code Playgroud)


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>
Run Code Online (Sandbox Code Playgroud)

context-root是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"/>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

调节器

@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.");
        }

    }
Run Code Online (Sandbox Code Playgroud)

对于日志,我试图添加log4j.logger.org.springframework.web=DEBUG到我现有的log4j.properties但它不起作用.

Bar*_*art 12

@RequestParam String action建议没有与名称的请求中存在的一个参数的动作是在你的形式存在.你必须:

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


Abb*_*bby 12

我也有这个问题,我的解决方案也不同,所以在这里添加任何有类似问题的人.

我的控制器有:

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

问题是这应该是@ModelAttribute针对对象的,而不是@RequestParameter.此错误消息与您在问题中描述的相同.

@RequestMapping(value = "/setPassword", method = RequestMethod.POST)
public String setPassword(Model model, @ModelAttribute SetPassword setPassword) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

  • `@ ModelAttribute`将起作用,因为它还将请求绑定到带注释的目标.但是,@ RequestParam`更适合单独绑定请求参数. (2认同)

sas*_*_bg 8

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

@RequestMapping处理程序方法可以具有非常灵活的签名.支持的方法参数和返回值将在下一节中介绍.除了BindingResult参数之外,大多数参数可以以任意顺序使用.这将在下一节中介绍.

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

Errors或BindingResult参数必须遵循立即绑定的模型对象,因为方法签名可能有多个模型对象,Spring将为每个模型对象创建一个单独的BindingResult实例,因此以下示例将不起作用:

这是两个例子:

BindingResult和@ModelAttribute的排序无效.

@RequestMapping(method = RequestMethod.POST)public String processSubmit(@ModelAttribute("pet")Pet pet,Model model,BindingResult result){...}注意,Pet和BindingResult之间有一个Model参数.要使其正常工作,您必须按如下方式重新排序参数:

@RequestMapping(方法= RequestMethod.POST)公共字符串processSubmit(@ModelAttribute( "PET")宠物的宠物,BindingResult结果,模型模型){...}