4

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

公共 @interface 请求参数

指示方法参数应绑定到 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 请求,或者我是否需要更改某些内容才能使其工作?

谢谢。

4

2 回答 2

8

实际上,它适用于 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!");
    }
});
于 2013-05-29T12:23:21.607 回答
2

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

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

Spring 确实提供了对 map via 的支持,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 "";

    }
于 2013-05-29T08:41:00.087 回答