有人可以解释以下行为:
给出以下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
变量并不会改变任何内容。它仍然是空的。