@RequestMappingアノテーションの属性詳細解説

1. name

このname属性は、メソッドの役割を説明するための補足情報として機能します。コードの可読性を向上させます。

@RequestMapping(value = "/api/login", name = "ユーザーログイン処理")
@ResponseBody
public String authenticateUser() {
    return "認証成功";
}

2. value

リクエストを処理する実際のURLパスを指定します。指定するパスはURIテンプレートパターンを使用できます。

@Controller
@RequestMapping("/user") // これは@RequestMapping(value="/user")と同じ意味です
public class UserDataController {
    @RequestMapping("/profile")
    @ResponseBody
    public String getUserProfile() {
        return "プロファイルデータ";
    }
}

value属性は@RequestMappingアノテーションのデフォルト属性であるため、もし他の属性が指定されていない場合は、属性名を省略できます。複数の属性が指定される場合は、value属性名を明記する必要があります。以下の2つのアノテーションは同じ意味を持ちます。

@RequestMapping(value="/data")
@RequestMapping("/data")

value属性はワイルドカードマッチングをサポートしています。

@RequestMapping(value="/data/*")

これは、http://localhost:8080/data/1 や http://localhost:8080/data/details のようなURLでこのインターフェースにアクセスできることを意味します。上記の例では、http://localhost:8080/user/profile というURL経由でアクセスすると、profile()メソッドが処理されます。

3. path

value属性と同義語です。RequestMappingインターフェースのソースコードでは、pathとvalueが互いに参照し合っています。

path属性は、先述のvalue属性と同じように、URLマッピングのために使用されます。

@RequestMapping(value="/data/list")
@RequestMapping(path="/data/list")

どちらの記述も、list()メソッドへのアクセスを可能にします。

path属性もワイルドカードマッチングをサポートしています。

@RequestMapping(path="/data/*")

これは、http://localhost:8080/data/123 や http://localhost:8080/data/search のようなURLでアクセスできることを意味します。

4. method

許可するHTTPリクエストメソッド(GET, POST, PUT, DELETEなど)を指定します。

@RequestMapping(value = "/api/submit", method = RequestMethod.POST)
@ResponseBody
public String submitData() {
    return "データ送信成功";
}

上記のメソッドは、POSTリクエストのみをサポートします。以下のように記述することも可能です。

@RequestMapping(value = "/api/search", method = {RequestMethod.GET, RequestMethod.POST})

これは、GETとPOSTの両方のリクエストをサポートすることを意味します。method属性が指定されていない場合、そのメソッドはすべてのHTTPリクエストメソッドをサポートします。

5. params

この属性は、リクエストが特定のパラメータを含んでいる場合にのみ、そのリクエストを処理するように指定します。

@RequestMapping(value = "/api/check", params = "id")
@ResponseBody
public String checkById() {
    return "IDによるチェック成功";
}

上記のメソッドは、リクエストにidパラメータが含まれている場合にのみ実行されます。idパラメータの値は問いません。

// 正常にアクセス
http://localhost:8080/api/check?id=123

// アクセス不可
http://localhost:8080/api/check
@RequestMapping(value = "/api/status", params = "active=true")
@ResponseBody
public String checkActiveStatus() {
    return "アクティブ状態の確認成功";
}

上記のメソッドは、リクエストにactiveパラメータが含まれ、その値がtrueである場合にのみ実行されます。

// 正常にアクセス
http://localhost:8080/api/status?active=true

// アクセス不可
http://localhost:8080/api/status?active=false
http://localhost:8080/api/status

6. headers

1. HTTPプロトコルでやり取りされる情報はHTTPメッセージと呼ばれます。クライアントが送信するHTTPメッセージはリクエストメッセージ、サーバーがクライアントに返すHTTPメッセージはレスポンスメッセージと呼ばれ、メッセージはメッセージヘッダーとメッセージボディで構成されます。 2. リクエストヘッダー:リクエストヘッダーには、クライアント環境やリクエストボディに関する多くの情報が含まれます。例えば、ブラウザがサポートする言語、要求先のサーバーアドレス、クライアントのオペレーティングシステムなどです。 3. レスポンスヘッダー:レスポンスヘッダーにも多くの有用な情報が含まれており、サーバータイプ、日付、レスポンスコンテンツのタイプやエンコーディング、レスポンスコンテンツの長さなどが含まれます。

この属性は、リクエストに特定のヘッダーの値が含まれている場合にのみ、そのメソッドがリクエストを処理するように指定します。例えば、Chromeブラウザでは、F12キーを押して開発者ツールを開き、NetworkタブでName欄の項目をクリックし、右側のHeadersを確認することでヘッダー情報を確認できます。

7. produces

レスポンスのContent-Typeを設定します。

Spring MVCでレスポンスボディのcontent typeをどのように設定するのでしょうか?

@RequestMapping(value = "/api/getData")
@ResponseBody  
public String fetchData(HttpServletRequest request, HttpServletResponse response)  
        throws IOException {  
    UserData userData = new UserData();
    String json = JsonUtils.objectToJson(userData); // JSON変換ユーティリティ
    return json;  
}    

このように記述すると、クライアントにはJSON形式のデータが返されますが、レスポンスのContent-Typeはtext/htmlのままです。これは問題を引き起こす可能性があります。特にJSONに日本語が含まれている場合、文字化けの原因となります。

解決策:

@RequestMapping(value="/api/getData", produces = MediaType.APPLICATION_JSON_VALUE + ";charset=utf-8")

Producible Media Typesの解説:Acceptリクエストヘッダーが指定された値のいずれかと一致する場合にのみ、リクエストがマッチします。さらに、生成条件を使用して、実際に使用されるコンテンツタイプが確実になるようにします。詳細は公式APIをご参照ください:http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/http/MediaType.html

プロジェクトでの使用例:

@RequestMapping(value = "/getList", produces = {"application/json;charset=UTF-8", "application/json"})
  1. @RequestMappingは、リクエストを特定のハンドラーメソッドにマッピングするためのアノテーションです。
  2. value = "/getList" は、HTTPリクエストのURLパスが/getListに一致した場合、このメソッドが呼び出されることを意味します。
  3. produces = {"application/json;charset=UTF-8", "application/json"} は、このメソッドが返すレスポンスのメディアタイプ(MIMEタイプ)を指定します。これは、メソッドがJSON形式のデータを返し、文字エンコーディングをUTF-8に明示的に指定することを意味します。2つ目の値"application/json"は少し冗長ですが(文字エンコーディングを指定していない)、文字エンコーディングを無視するクライアントとの互換性を確保するために使用されることがあります。

タグ: Spring Framework Spring MVC Java

7月10日 20:01 投稿