@RequestMapping で正規表現を使って @PathVariable を宣言する

普段、こういう使い方をしないので、URI のパスの宣言に正規表現が使えることを初めて知りました...。

URI patterns - Web on Servlet Stack


@GetMapping("/users/{id:[0-9]{5}}") // 数字5桁
public String get(@PathVariable long id) {
    //
}

また、1つのパスの中身は分解して変数に抽出できる。

@GetMapping("/users/{prefix:[a-z]{1}}{id:[0-9]{5}}") // 英小文字1桁 + 数字5桁
public String get(@PathVariable String prefix, @PathVariable long id) {
    //
}

固定の prefix の場合はこういう書き方も可。例えば、内部では数字で扱うけど、外部からは prefix 付きでアクセスされるような要件があるときに便利かもしれない。

@GetMapping("/users/user{id:[0-9]{5}}") // `user` + 数字5桁
public String get(@PathVariable long id) {
    //
}

あと、同階層の URI のパスに応じて Controller のメソッド呼び出しが分けられる。

@GetMapping("/users/user{id:[0-9]{5}}")
public String get1(@PathVariable long id) {
    // /users/user12345 はこっちに入る
}
@GetMapping("/users/admin{id:[0-9]{5}}")
public String get2(@PathVariable long id) {
    // /users/admin12345 はこっちに入る
}

今までは1つのメソッドで受けて、パラメータを判定して処理を分岐したりしてたかもしれないけど、Controller のメソッドで分岐できるならその方がアプリケーションコードはシンプルになりそう。