エキサイト株式会社エンジニアの佐々木です。古いシステムをSpringBootリビルドしており、リクエストパラメータの命名が統一されていないというのがあったので、対応方法の一例を紹介します。
@RequestParamで解決する
@RequestParam
のname
属性で指定できます。
@GetMapping public String index(@RequestParam(name = "last_name") String lastName){ return lastName; } curl "http://localhost:8080?last_name=buzz" "buzz"
この方法は、パラメータが少ないときはいいのですが、多くなってくるとこのメソッドが辛くなっていきます。次はオブジェクトでの受け取り方法です。
変数名を変更する
オブジェクトで受け渡すときは、変数名を変更すると対応できます。last_name
の変数名を
@RestController @RequestMapping public class DemoController { @RequestMapping public String index(Form form){ return ""; } @Data static class Form { private String last_name; } } curl "http://localhost:8080?last_name=buzz" { "last_name": "buzz" }
これだと、レスポンスされるデータや内部で使うデータもスネークケースになってしまいます。Javaは、キャメルケースが通常なので、変換が面倒になります。
@ConstructorPropertiesで整える
スネークケースが必要な箇所だけ、@ConstructorProperties
を付与します。
@RestController @RequestMapping public class DemoController { @RequestMapping public Form index(@Valid Form form){ return ""; } @Data static class Form { private String firstName; @NotEmpty private String lastName; private String phoneNumber; @ConstructorProperties({"last_name","phone_number"}) public Form(String lastName, String phoneNumber){ this.lastName = lastName; this.phoneNumber = phoneNumber; } } } // バリデーションも効きます curl "http://localhost:8080?firstName=fizz&last_name=buzz&phone_number=123" { "lastName": "buzz", "phoneNumber": "123", "firstName": "fizz" } curl "http://localhost:8080?firstName&phone_number=123" // Validation Error.
検索とかは受け取るパラメータが多かったりするんで、中にはスネークケースのものがあったりします。1つだけ例外があった場合に、すべてのパラメータをコンストラクターで定義しないといけないのは辛いので、必要な箇所だけでいいようにします。ここらへんは賢いと思います。
最後に
パラメータの命名等は、コンパイル等では弾けず、linterでも見落とす部分があるので、最終APIでカバーすることになると思いますが、この程度でよければ解決できそうなので、ぜひ利用してみてください。
エキサイトではバックエンドエンジニア、アプリエンジニア、フロントエンジニア、UI/UXデザイナーを積極採用中です。ぜひご連絡ください。
カジュアル面談はこちらになります! meety.net
募集職種一覧はこちらになります!(カジュアルからもOK) www.wantedly.com