こんにちは。 エキサイト株式会社の三浦です。
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 ) { // 処理 }
こうすれば、 sampleRequestModel
の query1
に、 test
という文字列が入ります。
では、
https://sample/?query1=
このような時はどうでしょうか?
Spring Bootと空のクエリパラメータ
実はこれは、 query1
をどのような型で受け取るかによって結果が異なってきます。
import lombok.Value; @Value public class SampleRequestModel { String query1; }
のように String
で受け取る場合は 空文字 になりますが、 Boolean
や Integer
等の場合は Null となるので、注意が必要です。
更に、
https://sample/
のように、そもそもURLにクエリパラメータが存在しない場合は、 String
も含めて Null になるのでご注意ください。
最後に
よくよく考えてみれば妥当な挙動ではありますが、慣れないうちや急いでいたりするとすべてNullで来ると勘違いしてしまうこともあると思います。
そうすると、予期せぬ空文字が入ってきてしまいエラーになってしまう可能性もあるので、注意していきましょう。