今回は、「Spring Boot」+「Spring Web MVC」を使用して、GETリクエストパラメータ(クエリパラメータ)から情報を取得する方法を紹介していきます。
検証環境
検証に使用した環境/ライブラリは、次のようになります。
- Java
- バージョン:11
- Gradle
- バージョン:7.1.1
- Spring Boot
- バージョン:2.5.3
ビルドスクリプト
プログラム例で使用するビルドスクリプトは、次のようになります。
plugins {
id 'org.springframework.boot' version '2.5.3'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'java'
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
}
リクエストパラメータ取得方法
「@RequestParam」を使用する
メソッド引数に「@RequestParam」を指定することで、GETリクエストパラメーターを取得することができます。プログラム例は、次のようになります。
コントローラークラス
「リクエストパラメータ」を取得した情報を返却するクラスです。
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ExampleController {
@GetMapping("/foo")
public String foo(@RequestParam("name") String name) {
return name;
}
}
実行例は、次のようになります。
$ curl "http://localhost:8080/foo?name=foo_name"
foo_name
「オブジェクトクラス」を使用する
メソッド引数に「オブジェクトクラス」を指定することで、GETリクエストのパラメータをオブジェクトで取得することができるようになります。
ただし、「リクエストパラメータ名」と「オブジェクト変数名」が一致していないと値が設定されないため注意してください。設定できるかどうかの例は、次のようになります。
- 設定できるパターン
- リクエストパラメータ名:lastName
- オブジェクト変数名:lastName
- 設定できないパターン
- リクエストパラメータ名:last_name
- オブジェクト変数名:lastName
プログラム例は、次のようになります。
リクエスト情報クラス
「リクエストパラメータ」を「オブジェクトクラス」に変換するためのクラスです。
public class ExampleRequest {
private String lastName;
private String firstName;
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
}
コントローラークラス
「リクエストパラメータ」を「オブジェクトクラス」に変換した情報を返却するクラスです。
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ExampleController {
@GetMapping("/bar")
public ExampleRequest bar(ExampleRequest request) {
return request;
}
}
「リクエストパラメータ名」と「オブジェクト変数名」が一致していない場合の実行例は、次のようになります。
$ curl "http://localhost:8080/bar?last_name=lastname&firstName=firstname"
{lastName=null, firstName=firstname}
「lastName
」が一致していないため値が取得できていないことを確認することができます。
「リクエストパラメータ名」と「オブジェクト変数名」が一致している場合の実行例は、次のようになります。
curl "http://localhost:8080/bar?lastName=lastname&firstName=firstname"
{lastName=lastname, firstName=firstname}
「lastName
」が一致しているため値が取得できていることを確認することができます。
「リクエストパラメータ名」が「last_name
」の場合は、「オブジェクト変数名」も「last_name
」に変更する必要があります。この問題を解決する案の1つとして「ObjectMapper
」を使用することで解決することができます。
「ObjectMapper」を使用する
メソッド引数に「@RequestParam」アノテーションと「Map」指定することで、GETリクエストのパラメーターを取得します。取得した「Map」と「ObjectMapper」を使用してオブジェクトクラスへの変換をすることができます。
「リクエストパラメータ名」と「オブジェクト変数名」が一致していない場合は、変換対象のオブジェクトクラスの変数名に「@JsonProperty」を設定することで解決することができます。プログラム例は、次のようになります。
リクエスト情報クラス
「リクエストパラメータ」を「オブジェクトクラス」に変換するためのクラスです。
import com.fasterxml.jackson.annotation.JsonProperty;
public class ExampleRequest {
@JsonProperty("last_name")
private String lastName;
private String firstName;
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
}
「lastName
」の変数名を「last_name
」で取得できるように「@JsonProperty("last_name")
」を指定しています。
コントローラクラス
「リクエストパラメータ」を「オブジェクトクラス」に変換した情報を返却するクラスです。
import java.util.Map;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.fasterxml.jackson.databind.ObjectMapper;
@RestController
public class ExampleController {
@GetMapping("/baz")
public ExampleRequest baz(@RequestParam Map<String, String> params) {
ObjectMapper mapper = new ObjectMapper();
return mapper.convertValue(params, ExampleRequest.class);
}
}
実行例は、次のようになります。
$ curl "http://localhost:8080/baz?last_name=lastname&firstName=firstname"
{"firstName":"firstname","last_name":"lastname"}
「HttpServletRequest」を使用する
メソッド引数に「HttpServletRequest」クラスを使用することで、GETリクエストのパラメーターを取得することができるようになります。プログラム例は、次のようになります。
コントローラクラス
「リクエストパラメータ」を「オブジェクトクラス」に変換した情報を返却するクラスです。
import javax.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ExampleController {
@GetMapping("/qux")
public String qux(HttpServletRequest params) {
return params.getParameter("name");
}
}
実行例は、次のようになります。
$ curl "http://localhost:8080/qux?name=name"
name
まとめ
GETリクエストパラメータの取得方法とオブジェクトクラスへの変換方法を紹介しました。
「リクエストパラメータ名」と「オブジェクト変数名」が一致しないときの対応方法については、参考になるかと思います。