Spring MVCの@RequestMappingでパスにピリオドを含めると拡張子とみなされる問題。

Spring MVCには、@RequestMappingというアノテーションがあり、これをメソッドにつけるだけで、特定のHTTPリクエストがメソッドにひもづけられます。
これはとても便利なのですが、少し変な使い方をしたら、怪しげな挙動を起こしました。

パスにピリオドを含めると最後のピリオド以降が拡張子とみなされる。

今回この問題に遭遇した原因は、リクエストパスにバージョンを含めようとしたことです。

http://example.com/documents/1.0.0
@RequestMapping(value = "/documents/{version}", method = RequestMethod.GET)

これで@PathVariableアノテーションをつけたversion変数に「1.0.0」が入るはずだったのですが、versionに「1.0」しか入らなかったのです。
Spring MVC @PathVariable getting truncated
これは、Springがパスの最後のピリオド以降を拡張子とみなしているからだと分かりました。

http://example.com/documents/1.0.0/

パスの最後にスラッシュをいれると、ピリオド以降は拡張子とみなされなくなり、version変数には「1.0.0」が入るようになりますが、これでは使い物にならない・・・。

パス指定にパターンマッチを使用する

解決策は、上に貼ったStack Overflowからですが、パス指定に具体的なパターンを指定することです。

@RequestMapping(value = "/documents/{version:.+}", method = RequestMethod.GET)

これで無事にversion変数が正しくとることができました。
RESTには拡張子で出力形式を指定するという仕様があるので、このような挙動をするのだと思いますが、一瞬戸惑う問題でした。
@RequestMappingに関連するブログです。→「Spring MVCの@RequestMappingでサブドメインを振り分ける。

コメント

タイトルとURLをコピーしました