9

这似乎是一个普遍的问题。我已经完成了 SO 中给出的所有答案,但无法使其发挥作用。
我正在尝试将 Spring MVC+Freemarker 集成到现有的 Web 应用程序中。它适用于GET请求,并且 Freemarker 模板可以毫无问题地读取 Controller 提供的 java 对象。
但表单提交无法命中控制器方法。最后我让 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


自由标记:

<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.properties 中,但没有成功。

4

11 回答 11

12

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

我的控制器有:

@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) {
    ...
}
于 2013-10-11T05:00:27.810 回答
12

@RequestParam String action表明请求中存在一个参数,其名称操作在您的表单中不存在。您必须:

  1. 提交一个名为value的参数,例如<input name="action" />
  2. 将所需参数设置false@RequestParam例如@RequestParam(required=false)
于 2013-07-22T19:25:13.083 回答
9

另一个可能的原因是 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(method = RequestMethod.POST) public String processSubmit(@ModelAttribute("pet") Pet pet, BindingResult result, Model model) { ... }

于 2016-03-10T15:50:52.077 回答
3

我遇到了类似的问题,发现像 Date 这样的一些字段没有得到具体的值,一旦给定了值,事情就很好了。请确保表单上没有日期或任何其他需要具体值的字段。

于 2014-10-08T19:07:39.487 回答
1

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

于 2014-07-25T11:40:42.157 回答
1

基于错误:

Required String parameter 'action' is not present

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

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

于 2013-07-22T19:01:47.343 回答
1

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

于 2017-04-23T11:49:17.653 回答
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/save

如果有什么像PORTAL/jsp/save提到的@RequestMapping(value="/jsp/save")

于 2013-07-22T17:27:16.760 回答
0

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

于 2013-07-22T17:15:13.410 回答
0
@CookieValue(value="abc",required=true) String m

当我将 required 从 true 更改为 false 时,它​​成功了。

于 2016-02-26T19:39:02.130 回答
0

在您的方法中添加 BindingResult 参数。供参考,请参阅下面的代码。

save(@ModelAttribute Employee employee,BindingResult bindingResult)

于 2019-07-30T16:23:49.160 回答