カテゴリ: Spring 更新日: 2026/01/11

Javaの@PathVariableアノテーションの使い方を徹底解説!初心者でもわかるパスパラメータの基本と応用

Springの@PathVariableアノテーション
Springの@PathVariableアノテーション

先生と生徒の会話形式で理解しよう

生徒

「Spring Frameworkで@PathVariableというのを見たんですが、これってどうやって使うんですか?」

先生

「いい質問だね!@PathVariableは、URLパスから値を取得するために使うアノテーションだよ。例えば、URLの一部にIDを入れて、そのIDを取得したいときに便利なんだ。」

生徒

「それってどうやって実装するんですか?サンプルコードが見たいです!」

先生

「じゃあ、基本的な使い方を一緒に見てみよう!」

1. @PathVariableアノテーションとは?

1. @PathVariableアノテーションとは?
1. @PathVariableアノテーションとは?

@PathVariableは、Spring MVCでURLのパスから変数を取得するためのアノテーションです。例えば、REST APIでユーザーIDや商品IDなど、動的に変わる部分をURLから取得したいときに使います。以下の例を見てください。


import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {

    @RequestMapping("/user/{id}")
    public String getUserById(@PathVariable String id) {
        return "User ID: " + id;
    }
}

上記の例では、/user/123のようなURLにアクセスすると、「User ID: 123」というレスポンスが返されます。{id}の部分が@PathVariableで取得できる部分です。

2. @PathVariableの基本的な使い方

2. @PathVariableの基本的な使い方
2. @PathVariableの基本的な使い方

まずは、簡単な例から始めましょう。以下のコードでは、URLからユーザー名を取得し、それを利用してメッセージを返しています。


import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class GreetingController {

    @RequestMapping("/greet/{name}")
    public String greetUser(@PathVariable String name) {
        return "Hello, " + name + "!";
    }
}

実行結果例


GET /greet/John
=> Hello, John!

このように、@PathVariableを使うことで、URLのパスに含まれるデータを簡単に取得できます。

3. データ型の変換と複数の@PathVariable

3. データ型の変換と複数の@PathVariable
3. データ型の変換と複数の@PathVariable

@PathVariableは、様々なデータ型をサポートしています。例えば、数値型のパラメータを使いたい場合も簡単に対応できます。また、複数のパス変数を扱うこともできます。


import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class OrderController {

    @RequestMapping("/order/{orderId}/item/{itemId}")
    public String getOrderItem(@PathVariable int orderId, @PathVariable int itemId) {
        return "Order ID: " + orderId + ", Item ID: " + itemId;
    }
}

実行結果例


GET /order/101/item/202
=> Order ID: 101, Item ID: 202

複数の@PathVariableを使うことで、より複雑なURL構成にも対応可能です。

4. Optionalな@PathVariableの使い方

4. Optionalな@PathVariableの使い方
4. Optionalな@PathVariableの使い方

パスパラメータを必須ではなく、オプションとして扱いたい場合もあります。Springではrequired = false属性を利用して、それを実現できます。


import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ProductController {

    @RequestMapping("/product/{productId}")
    public String getProduct(@PathVariable(required = false) String productId) {
        if (productId == null) {
            return "No Product ID provided";
        }
        return "Product ID: " + productId;
    }
}

この設定を使うと、/productのようなURLにアクセスした際でも、エラーにならずに処理が続行されます。

5. @PathVariableと正規表現の活用

5. @PathVariableと正規表現の活用
5. @PathVariableと正規表現の活用

@PathVariableでは正規表現を使って、パスパラメータのフォーマットを制限することもできます。例えば、IDが数字のみの場合に限定したいときに役立ちます。


import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ValidationController {

    @RequestMapping("/validate/{code:[a-zA-Z]+}")
    public String validateCode(@PathVariable String code) {
        return "Validated Code: " + code;
    }
}

実行結果例


GET /validate/ABC123
=> 404 Not Found

GET /validate/ABC
=> Validated Code: ABC

正規表現を活用することで、より精密なURLパラメータの制御が可能です。

6. パス変数名の明示指定(name/value属性)と命名のベストプラクティス

6. パス変数名の明示指定(name/value属性)と命名のベストプラクティス
6. パス変数名の明示指定(name/value属性)と命名のベストプラクティス

URLテンプレートの変数名とメソッド引数名が一致しない場合は、@PathVariable("...")で明示します。複数のパス変数があるときも、可読性のために明示指定が推奨です(SEO観点でも「@PathVariable 使い方」「パスパラメータ 命名」のキーワードにマッチ)。


import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/users")
public class ProfileController {

    // URL: /users/42/profile/ja
    @GetMapping("/{userId}/profile/{lang}")
    public String profile(
            @PathVariable("userId") Long id,
            @PathVariable("lang") String localeCode) {
        return "user=" + id + ", lang=" + localeCode;
    }

    // 変数名が長い場合も、URIは短く・引数は意味的に
    // URL: /users/42/orders/777
    @GetMapping("/{uid}/orders/{oid}")
    public String orderDetail(
            @PathVariable("uid") Long userId,
            @PathVariable("oid") Long orderId) {
        return "userId=" + userId + ", orderId=" + orderId;
    }
}
  

リソース名は複数形(/users/orders)にし、URLは短く・引数名はドメインに沿って意味的にします。

7. LocalDate・UUID・Enumなどの型を@PathVariableで受け取る(型変換の応用)

7. LocalDate・UUID・Enumなどの型を@PathVariableで受け取る(型変換の応用)
7. LocalDate・UUID・Enumなどの型を@PathVariableで受け取る(型変換の応用)

@PathVariableはプリミティブ以外にも、LocalDateUUIDenumなど多様な型を自動変換できます。日付には@DateTimeFormatを併用しましょう(キーワード:@PathVariable 型変換LocalDate UUID Enum)。


import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;
import java.time.LocalDate;
import java.util.UUID;

@RestController
@RequestMapping("/analytics")
public class AnalyticsController {

    // URL: /analytics/daily/2025-08-01
    @GetMapping("/daily/{date}")
    public String daily(
            @PathVariable
            @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate date) {
        return "Daily report for " + date;
    }

    // URL: /analytics/session/123e4567-e89b-12d3-a456-426614174000
    @GetMapping("/session/{token}")
    public String session(@PathVariable UUID token) {
        return "Session token=" + token;
    }

    // Enumは文字列マッチ(大文字小文字は定義に合わせる)
    enum State { OPEN, CLOSED, PENDING }

    // URL: /analytics/state/OPEN
    @GetMapping("/state/{state}")
    public String state(@PathVariable State state) {
        return "State=" + state.name();
    }
}
  

変換に失敗した場合は400系エラーになります。想定フォーマットを明示し、必要に応じてハンドリングを用意しましょう。

8. Optionalな@PathVariableの正しい実装(複数パターン&Optional)

8. Optionalな@PathVariableの正しい実装(複数パターン&Optional)
8. Optionalな@PathVariableの正しい実装(複数パターン&Optional)

パスパラメータを任意にする場合は、複数のURLパターンを同一メソッドに割り当てて@PathVariable(required = false)またはOptional<T>で受け取るのが実用的です(キーワード:Optional @PathVariable任意 パスパラメータ)。


import org.springframework.web.bind.annotation.*;
import java.util.Optional;

@RestController
public class ProductQueryController {

    // /products と /products/{productId} の両方を許可
    @GetMapping({"/products", "/products/{productId}"})
    public String getProduct(
            @PathVariable(required = false) String productId) {
        return (productId == null)
                ? "All products"
                : "Product ID: " + productId;
    }

    // Optional を使うバリエーション
    @GetMapping({"/catalog", "/catalog/{category}"})
    public String catalog(@PathVariable Optional<String> category) {
        return category
                .map(c -> "Category: " + c)
                .orElse("All categories");
    }
}
  

URIテンプレート側に可否を定義するのがポイントです。単一の/path/{var}だけでは/pathはマッチしません。

まとめ

まとめ
まとめ

今回は、JavaのSpring Frameworkにおける@PathVariableアノテーションについて詳しく解説しました。このアノテーションを使うことで、URLパスの一部をパラメータとして取得し、効率的にAPIを設計できます。例えば、/user/{id}のように、ユーザーIDや商品IDをURLパスから取得するのが一般的な使い方です。Spring Bootを用いたWebアプリケーション開発では、この@PathVariableの活用が欠かせません。

基本的な使い方から、データ型の変換、複数の@PathVariableの使用方法、オプションパラメータ、さらに正規表現を使ったURLパラメータの制約まで、幅広い使い方を学びました。これらの知識を使えば、より柔軟で強力なAPIを設計できるようになります。

具体的な実装方法や、Springの他のアノテーション(例えば、@RequestParam@RequestBody)との違いを理解することで、開発スキルの向上が期待できます。また、@PathVariableはRESTful APIの設計にも非常に役立つため、今後の開発に活用していきましょう。

実践サンプル:全機能の総復習

ここまでの内容を踏まえた総合的なサンプルプログラムを用意しました。複数の@PathVariableと正規表現を組み合わせた応用例です。


import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class AdvancedController {

    @RequestMapping("/api/{version:v[0-9]+}/users/{userId:[0-9]+}")
    public String getUserByVersion(@PathVariable String version, @PathVariable int userId) {
        return "API Version: " + version + ", User ID: " + userId;
    }
}

実行結果例


GET /api/v1/users/123
=> API Version: v1, User ID: 123

GET /api/v2/users/abc
=> 404 Not Found

このサンプルでは、APIのバージョン管理を{version:v[0-9]+}という形で、ユーザーIDは数値のみを許可する{userId:[0-9]+}という正規表現で制御しています。これにより、誤った形式のURLリクエストを防ぎ、APIの信頼性を向上させることができます。

先生と生徒の振り返り会話

生徒

「今日の授業で学んだ@PathVariableアノテーション、すごく便利ですね!特にURLから動的に値を取得できるのが面白かったです。」

先生

「そうだね。これを使うと、APIの設計が柔軟になるんだ。例えば、ユーザーIDや商品のカテゴリなど、URLパスに組み込んだ情報を簡単に利用できるんだよ。」

生徒

「複数の@PathVariableも同時に使えるから、いろんなケースに対応できそうですね。オプションにしたり、正規表現で制御するのも便利です。」

先生

「その通り!データのバリデーションやAPIバージョン管理にも応用できるから、実務でもよく使われるテクニックだよ。これからのプロジェクトでぜひ活用してみてね。」

生徒

「はい!次回は@RequestParamについても教えてください。」

先生

「もちろん!次回は@RequestParamを使ったクエリパラメータの処理について詳しく学んでいこう!」

この記事を読んだ人からの質問

この記事を読んだ人からの質問
この記事を読んだ人からの質問

プログラミング初心者からのよくある疑問/質問を解決します

@PathVariableとは何ですか?Spring MVCやSpring BootのREST APIでの役割、URLパスから値を取り出すパスパラメータの基本を、初心者向けに具体的に知りたいです。

@PathVariableは、Spring MVCやSpring BootのREST APIでURLパスの一部をパスパラメータとして受け取り、コントローラの引数にマッピングするためのアノテーションです。ユーザーID・商品ID・カテゴリコードなどリソースを識別する値を、セマンティックなURL設計(/users/123 のような形)で表現でき、直感的でSEOにも強い読みやすいエンドポイントを実現します。

@PathVariableの使い方の全体像を教えてください。URL設計、エンドポイント設計、パス変数の書き方、リソースIDの受け取り方など、実装手順の流れを知りたいです。

基本の流れは、読みやすいURL設計を決め、リソース名を複数形で表し、識別子を{変数名}としてパスに埋め込み、その変数名に対応する引数へ@PathVariableで受け取る、という手順です。これによりRESTエンドポイントは、パス=リソース、パスパラメータ=識別子、クエリ=条件という役割分担で整理され、保守性と検索性が向上します。

Spring BootとSpring MVCで@PathVariableの使い方に違いはありますか?アノテーションの意味、コントローラでの宣言方法、RESTエンドポイントの作り方は同じでしょうか。

アノテーション自体の使い方は同じです。Spring MVCでもSpring Bootでも、コントローラメソッドの引数に@PathVariableを付与すればURLから値が渡されます。違いが出るのは起動方法や設定の簡便さで、Bootでは自動設定が豊富なため、REST APIの実装とテストがスムーズになる点が初心者にメリットです。

パスに識別子、クエリに条件という分担にすると、URLの一意性や読みやすさは向上しますか?検索エンジンに評価されやすい構造や、重複URLの回避との関係を教えてください。

役割分担を徹底すると、同じ内容を示すURLが増えにくくなり、意味のある短いパスが保てます。検索エンジンにも解釈されやすく、重複コンテンツの発生を抑えられます。URL設計の一貫性は、ドキュメントや運用の分かりやすさにも直結します。

@PathVariableで受けるIDと@RequestParamで受けるpage/size/sortが混在すると、初心者は混乱しませんか?URLの命名規則や順序、ドキュメントの書き方のコツを知りたいです。

URLの規約を最初に宣言し、例で示すのが効果的です。パスには名詞とID、クエリにはpage, size, sortなど一般的な名前を採用します。順序はパス→クエリの規則を徹底し、ドキュメントに典型パターンを掲載して学習コストを下げます。

同じ検索を再現可能にしたいとき、クエリパラメータをどう設計すればブックマークや共有がしやすくなりますか?並び順の既定値や省略規則も教えてください。

クエリは順不同でも同じ意味になるように設計し、既定値(page=1, size=20, sort=createdAt,desc など)を明記します。省略時の既定動作と、URLの正規化方針を合わせてドキュメント化すると、ブックマーク・共有・再実行が容易になります。

@PathVariableを増やしすぎるとURLが深くなりますが、どこまで許容すべきですか?/users/{id}/orders/{id}/items/{id}のような深い階層のリスクと代替案を知りたいです。

深い階層はURLが長くなり、可読性と権限管理が難しくなります。代替として、過度な入れ子を避け、必要に応じて子リソースをトップレベルに昇格させ、親IDはクエリで関連付けるなどの設計を検討します。シンプルさは保守性に直結します。
カテゴリの一覧へ
新着記事
Springの@Transactional徹底解説!トランザクションの伝播・分離レベル・タイムアウトの基本
JavaのHashMapクラスgetメソッドの使い方を完全ガイド!初心者でもわかるjava.util入門
Thymeleafのth:fragmentを使ったテンプレートの再利用方法を完全ガイド!初心者でもわかる使い方
Javaの@PathVariableアノテーションの使い方を徹底解説!初心者でもわかるパスパラメータの基本と応用
人気記事
No.1
Java&Spring記事人気No1
Javaのラムダ式で配列を扱う!Arrays.streamの基本と注意点を初心者向けに解説
No.2
Java&Spring記事人気No2
JavaのRuntimeExceptionを完全解説!初心者でもわかるjava.langパッケージの基礎
No.3
Java&Spring記事人気No3
Spring BootとJavaの互換性一覧!3.5/3.4/3.3はJava 21・17に対応してる?
No.4
Java&Spring記事人気No4
JavaのIntegerクラスの使い方を完全ガイド!初心者でもわかる整数操作
No.5
Java&Spring記事人気No5
JavaのBigDecimalクラスcompareToメソッド完全ガイド!初心者でもわかる大小比較の基本
No.6
Java&Spring記事人気No6
Springの@Serviceアノテーションの使い方を徹底解説!初心者でもわかるSpring フレームワーク入門
No.7
Java&Spring記事人気No7
Javaの@SuppressWarningsアノテーションの使い方を完全ガイド!初心者でもわかる警告の抑制方法
No.8
Java&Spring記事人気No8
JavaのHttpSessionを徹底解説!初心者でもわかるセッション管理の基本