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}

ラッパーオブジェクト内に含まれている場合、 Springmapが変数値のみをバインドするのはなぜですか?

編集

@RequestParam JavaDocを見ると、それは述べています

メソッド パラメータがMap<String, String>またはMultiValueMap<String, String>で、パラメータ名が指定されていない場合、map パラメータにはすべてのリクエスト パラメータの名前と値が入力されます。

しかし、変数に追加@RequestParam(name = "map")してmapも何も変わりません。まだ空です。

4

0 に答える 0