65434


RequestParamの`List<String>`にて、スペース文字(%20)を受け取りたいのですが、空しか取れません。

[code]

    @GetMapping(path = "/api/example")
    public String param(@RequestParam(name = "param", required = false) List<String> param) {
        if (param == null) {
            param = Collections.emptyList();
        }
        return param.toString();
    }
    
[/code]

カンマ区切りで下記を実行すると、"AAA","","BBB"となってしまいます。  
<http://localhost:8080/api/example?param=AAA,%20,BBB>  
[![カンマ区切り](https://i.stack.imgur.com/bKhz4.png)](https://i.stack.imgur.com/bKhz4.png)

下記のようにパラメータ自体を分けてあげれば、正常に動作するのは確認できました。  
[http://localhost:8080/api/example?param=AAA&param=%20&param=BBB](http://localhost:8080/api/example?param=AAA&param=%20&param=BBB)  
[![パラメータ区切り](https://i.stack.imgur.com/9iJJu.png)](https://i.stack.imgur.com/9iJJu.png)

カンマ区切りでもスペース文字を正常に受け取る方法があればご教授ください。


CC BY-SA 4.0
2020-04-07T00:58:52.013
65419
2020-04-07T06:20:52.697
39523
question
java spring-boot
SpringBootのRequestParamにてスペース文字を受け取りたい


動作検証はしていませんが、おそらく、[この辺](https://github.com/spring-projects/spring-
framework/blob/master/spring-
core/src/main/java/org/springframework/core/convert/support/StringToArrayConverter.java#L72)で`String.trim()`してるからだと思います。

なので、`List<String>`ではなく、`String`で受け取って、Controllerで`List<String>`に変換するのが1つの対応方法ですかね。

※最終的に`return param.toString();`するなら、`List<String>`に変換しなくてもいいかもしれませんが...


CC BY-SA 4.0
2020-04-07T01:38:36.093
65420
2020-04-07T01:38:36.093
21092
65419
answer


  * [Provide mechanism to control trimming in StringToArrayConverter and StringToCollectionConverter · Issue #23850 · spring-projects/spring-framework](https://github.com/spring-projects/spring-framework/issues/23850)

と同源の事象かと思います。現状フレームワーク組み込みの機能でコントロールすることはできないので自前で実装する必要がありそうです。

* * *

Controller引数の型変換は`WebDataBinder`でカスタマイズできます。

  * [Type Conversion](https://docs.spring.io/spring/docs/5.2.5.RELEASE/spring-framework-reference/web.html#mvc-ann-typeconversion) \- 1.3.3. Handler Methods
  * [1.3.5. DataBinder](https://docs.spring.io/spring/docs/5.2.5.RELEASE/spring-framework-reference/web.html#mvc-ann-initbinder)

配列への変換であればユーティリティクラス[`StringArrayPropertyEditor`](https://github.com/spring-
projects/spring-framework/blob/v5.2.5.RELEASE/spring-
beans/src/main/java/org/springframework/beans/propertyeditors/StringArrayPropertyEditor.java#L88-L89)が提供されていたのでこれを用いて実装してみました([コード全体](https://github.com/yukihane/stackoverflow-
qa/blob/master/so65419/src/main/java/com/example/demo/MyController.java)):

[code]

    @InitBinder
    protected void initBinder(final WebDataBinder binder) {
        binder.registerCustomEditor(String[].class, new StringArrayPropertyEditor(",", false, false));
    }
    
    @GetMapping(path = "/api/example")
    public String param(@RequestParam(name = "param", required = false) final String[] paramArray) {
        final List<String> param;
        if (paramArray == null) {
            param = Collections.emptyList();
        } else {
            param = Arrays.asList(paramArray);
        }
        return param.toString();
    }
    
[/code]


CC BY-SA 4.0
2020-04-07T06:02:19.823
65434
2020-04-07T06:20:52.697
2020-04-07T06:20:52.697
2808
2808
65419
answer