Spring请求参数解析

时间:2016-02-10 16:58:52

标签: java spring spring-mvc controller spring-web

有人可以解释以下行为:

给出以下HTTP GET请求
/test?q=queryString&map[one]=val&map[two]=val2&map[three]=val3

为什么这个Controller方法

@RequestMapping(value = "/test")
public ResponseEntity<Void> test(String q, Map<String, String> map) {
    log.info("Q: " + q);
    log.info("Map: " + map);

    return ResponseEntity.noContent().build();
}

结果

Q: queryString
Map: {}

而如果我将这两个参数包装在一个如此恰当的名为Wrapper

public class Wrapper {

    private String q;

    private Map<String, String> map;

    //getters & setters
}

并重构Controller方法

@RequestMapping(value = "/test")
public ResponseEntity<Void> test(Wrapper wrapper) {
    log.info("Q: " + wrapper.getQ());
    log.info("Map: " + wrapper.getMap());

    return ResponseEntity.noContent().build();
}

结果如下:

Q: queryString
Map: {one=val, two=val2, three=val3}

为什么 Spring 只绑定map变量值,如果它包含在包装器对象中?

修改

查看@RequestParam JavaDoc状态

  

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

但是将@RequestParam(name = "map")添加到map变量并不会改变任何内容。它仍然是空的。

0 个答案:

没有答案