Spring @RequestParam Map <string,string =“”>在POST方法</string,>中不起作用

时间:2013-05-29 08:36:17

标签: spring-mvc http-post

从Spring文档中我采取了以下内容:

  

public @interface RequestParam

     

注释,指示应将方法参数绑定到Web请求参数。支持Servlet和Portlet环境中带注释的处理程序方法。

     

...

     

如果方法参数是Map或MultiValueMap并且未指定参数名称,则使用所有请求参数名称和值填充map参数。

现在我已经为测试目的创建了一个控制器。它有一个GET和一个POST方法,每个都使用 @RequestParam java.util.Map 作为唯一参数。在方法体中,我只是试图打印地图的大小。当我仅在GET方法中发送请求(GET / POST)时,映射包含任何键/值对。我正在使用Firefox中的Poster插件,我正在发送三个参数。

import java.util.Map;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class TestController {

    @RequestMapping(value="test/method", method = RequestMethod.GET)
    @ResponseBody
    public String testmethodGet(@RequestParam Map<String, String> params) {

        System.out.println("GET: " + params.size()); // prints GET: 3   
        return "";

    }

    @RequestMapping(value="test/method", method = RequestMethod.POST)
    @ResponseBody
    public String testmethodPost(@RequestParam Map<String, String> params) {

        System.out.println("POST: " + params.size()); // prints POST: 0
        return "";

    }

}

你们中的任何人都知道为什么@RequestParam Map不适用于POST请求,或者我是否需要更改某些内容才能使其正常工作?

感谢。

2 个答案:

答案 0 :(得分:7)

实际上,它适用于GET和POST方法。这完全是我的错。当您实际将参数传递给POST请求时,最初给定的代码将起作用。

考虑以下JS(jQuery)代码作为如何发送有效请求:

$.ajax({
    type: "POST",
    url: "test/method",
    data: { param1: param1, param2: param2, param3: param3 },
    success: function(data) {
        console.log("testPost successful!");
    },    
    dataType: "html", // expected return value type
    error: function(data, status, error) {
        console.log("testPost with errors!");
    }
});

答案 1 :(得分:2)

Spring不知道如何将String收到的request param转换为地图。

  

从请求中提取的基于字符串的值,包括请求   参数,路径变量,请求标头和cookie值可以   需要转换为方法参数的目标类型或   字段(例如,将请求参数绑定到字段中的字段)   @ModelAttribute参数)他们被绑定了。如果目标类型不是   String,Spring自动转换为适当的类型。所有   支持简单类型,如int,long,Date等。您可以   通过WebDataBinder进一步自定义转换过程(请参阅   “自定义WebDataBinder初始化”一节或者通过   使用FormattingConversionService注册Formatters(请参阅   第7.6节“Spring 3字段格式”)。

Spring确实通过HttpServletReqeust为地图提供支持,可以通过getParameterMap()获取地图。

   @RequestMapping(value="test/method", method = RequestMethod.POST)
    @ResponseBody
    public String testmethodPost(HttpServletRequest request) {

        System.out.println("POST: " + request.getParameterMap().size()); // prints POST: 0
        return "";

    }