1. 概要

このクイックチュートリアルでは、Springの@RequestParamアノテーションとその属性について説明します。

簡単に言うと、 @RequestParam を使用して、リクエストからクエリパラメータ、フォームパラメータ、さらにはファイルを抽出できます。

2. 簡単なマッピング

idというクエリパラメータを受け取るエンドポイント/api /foosがあるとします。

@GetMapping("/api/foos")
@ResponseBody
public String getFoos(@RequestParam String id) {
    return "ID: " + id;
}

この例では、@RequestParamを使用してidクエリパラメーターを抽出しました。

単純なGETリクエストは、getFoosを呼び出します。

http://localhost:8080/spring-mvc-basics/api/foos?id=abc
----
ID: abc

次に、アノテーションの属性(名前、値、必須、デフォルト値)を見てみましょう。

3. リクエストパラメータ名の指定

前の例では、変数名とパラメーター名の両方が同じです。

ただし、これらを異なるものにしたい場合もあります。または、Spring Bootを使用していない場合は、特別なコンパイル時の構成を行う必要があります。そうしないと、パラメーター名が実際にはバイトコードに含まれません。 。

幸い、name属性を使用して@RequestParam名を構成できます。

@PostMapping("/api/foos")
@ResponseBody
public String addFoo(@RequestParam(name = "id") String fooId, @RequestParam String name) { 
    return "ID: " + fooId + " Name: " + name;
}

@RequestParam(value =“ id”)または @RequestParam(“ id”)。を実行することもできます。

4. オプションのリクエストパラメータ

デフォルトでは、@RequestParamで注釈が付けられたメソッドパラメーターが必要です。

これは、パラメータがリクエストに存在しない場合、エラーが発生することを意味します。

GET /api/foos HTTP/1.1
-----
400 Bad Request
Required String parameter 'id' is not present

@RequestParam をオプションとして構成できますが、必須の属性を使用します。

@GetMapping("/api/foos")
@ResponseBody
public String getFoos(@RequestParam(required = false) String id) { 
    return "ID: " + id;
}

この場合、両方:

http://localhost:8080/spring-mvc-basics/api/foos?id=abc
----
ID: abc

http://localhost:8080/spring-mvc-basics/api/foos
----
ID: null

メソッドを正しく呼び出します。

パラメータが指定されていない場合、メソッドパラメータはnullにバインドされます。

4.1. Javaの使用8オプション

または、パラメータをオプションでラップすることもできます。

@GetMapping("/api/foos")
@ResponseBody
public String getFoos(@RequestParam Optional<String> id){
    return "ID: " + id.orElseGet(() -> "not provided");
}

この場合、必要な属性を指定する必要はありません。

また、リクエストパラメータが指定されていない場合は、デフォルト値が使用されます。

http://localhost:8080/spring-mvc-basics/api/foos 
---- 
ID: not provided

5. リクエストパラメータのデフォルト値

defaultValue 属性を使用して、デフォルト値を@RequestParamに設定することもできます。

@GetMapping("/api/foos")
@ResponseBody
public String getFoos(@RequestParam(defaultValue = "test") String id) {
    return "ID: " + id;
}

これはrequired=falseに似ており、ユーザーはパラメーターを指定する必要がなくなります。

http://localhost:8080/spring-mvc-basics/api/foos
----
ID: test

ただし、それでも提供できます。

http://localhost:8080/spring-mvc-basics/api/foos?id=abc
----
ID: abc

defaultValue 属性を設定すると、requiredが実際にfalseに設定されることに注意してください。

6. すべてのパラメータのマッピング

名前を定義せずに複数のパラメーターを設定したりマップを使用してカウントしたりすることもできます。

@PostMapping("/api/foos")
@ResponseBody
public String updateFoos(@RequestParam Map<String,String> allParams) {
    return "Parameters are " + allParams.entrySet();
}

これにより、送信されたパラメータが反映されます。

curl -X POST -F 'name=abc' -F 'id=123' http://localhost:8080/spring-mvc-basics/api/foos
-----
Parameters are {[name=abc], [id=123]}

7. 複数値パラメーターのマッピング

1つの@RequestParamは複数の値を持つことができます。

@GetMapping("/api/foos")
@ResponseBody
public String getFoos(@RequestParam List<String> id) {
    return "IDs are " + id;
}

そしてSpringMVCはコンマ区切りのidパラメーターをマップします

http://localhost:8080/spring-mvc-basics/api/foos?id=1,2,3
----
IDs are [1,2,3]

または個別のIDパラメーターのリスト

http://localhost:8080/spring-mvc-basics/api/foos?id=1&id=2
----
IDs are [1,2]

8. 結論

この記事では、@RequestParam。の使用方法を学びました。

例の完全なソースコードは、GitHubプロジェクトにあります。