誰かが次の動作を説明できますか:
次の 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}
ラッパーオブジェクト内に含まれている場合、 Springmap
が変数値のみをバインドするのはなぜですか?
編集
@RequestParam
JavaDocを見ると、それは述べています
メソッド パラメータが
Map<String, String>
またはMultiValueMap<String, String>
で、パラメータ名が指定されていない場合、map パラメータにはすべてのリクエスト パラメータの名前と値が入力されます。
しかし、変数に追加@RequestParam(name = "map")
してmap
も何も変わりません。まだ空です。