1

有人可以解释以下行为:

给定以下 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变量并不会改变任何东西。它仍然是空的。

4

0 回答 0