Spring Bootで、文字列型の空クエリパラメータを受け取るときの注意点

こんにちは。 エキサイト株式会社の三浦です。

Spring BootのAPI等で空のクエリパラメータを受け取るとき、受け取り側の型や「空」の指定方法によって取得される値が違うことはご存知でしょうか?

今回は、その違いについて紹介していきます。

Spring Bootとクエリパラメータ

通常URLでクエリパラメータをつける時は、以下のようにします。

https://sample/?query1=test

これをSpring Bootで受け取る際は、

import lombok.Value;

@Value
public class SampleRequestModel {
    String query1;
}
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;

@GetMapping("sample")
public SampleModel getSample(
        @ModelAttribute @Validated SampleRequestModel sampleRequestModel
) {
    // 処理
}

こうすれば、 sampleRequestModelquery1 に、 test という文字列が入ります。

では、

https://sample/?query1=

このような時はどうでしょうか?

Spring Bootと空のクエリパラメータ

実はこれは、 query1 をどのような型で受け取るかによって結果が異なってきます。

import lombok.Value;

@Value
public class SampleRequestModel {
    String query1;
}

のように String で受け取る場合は 空文字 になりますが、 BooleanInteger 等の場合は Null となるので、注意が必要です。

更に、

https://sample/

のように、そもそもURLにクエリパラメータが存在しない場合は、 String も含めて Null になるのでご注意ください。

最後に

よくよく考えてみれば妥当な挙動ではありますが、慣れないうちや急いでいたりするとすべてNullで来ると勘違いしてしまうこともあると思います。

そうすると、予期せぬ空文字が入ってきてしまいエラーになってしまう可能性もあるので、注意していきましょう。