有人可以解释以下行为:
给定以下 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>
orMultiValueMap<String, String>
并且未指定参数名称,则使用所有请求参数名称和值填充 map 参数。
但是添加@RequestParam(name = "map")
到map
变量并不会改变任何东西。它仍然是空的。