カテゴリ: Micronaut 更新日: 2026/03/21

Micronautでパスパラメータを扱う方法を徹底解説!/users/{id} の基本と実践

Micronautでパスパラメータを扱う方法!/users/{id} の基本
Micronautでパスパラメータを扱う方法!/users/{id} の基本

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

生徒

「MicronautでWebアプリを作っているのですが、ユーザーごとにURLを変える方法ってありますか?例えば、ユーザーIDによって表示内容を変えたいんです。」

先生

「それは『パスパラメータ』という機能を使えば実現できます。URLの中に変数を埋め込んで、プログラム側でその値を受け取ることができるんですよ。」

生徒

「URLの一部を変数にするんですね!具体的にはどのように記述すればいいのでしょうか?」

先生

「とてもシンプルです。中括弧を使ってパスを指定するだけです。実際のコードを見ながら、基本的な使い方をマスターしていきましょう!」

1. パスパラメータとは?

1. パスパラメータとは?
1. パスパラメータとは?

パスパラメータとは、URL(Web上の住所)の一部を「変数」として扱う仕組みのことです。通常、WebサイトのURLは固定されていますが、特定のデータ(ユーザー、商品、記事など)を識別するために、URLの一部を動的に変化させたい場合があります。

例えば、/users/1/users/2 のように、数字の部分だけが変わるURLを想像してください。この「1」や「2」にあたる部分がパスパラメータです。Micronaut(マイクロノート)というJavaフレームワークでは、この可変部分をプログラムの中で変数として簡単に取り出すことができ、それによって「IDが1のユーザー情報を表示する」といった柔軟な処理が可能になります。プログラミング未経験の方でも、会員カードの番号によって呼び出すデータが切り替わる仕組みと同じだと考えれば分かりやすいでしょう。

2. パスパラメータの基本的な書き方

2. パスパラメータの基本的な書き方
2. パスパラメータの基本的な書き方

Micronautでパスパラメータを定義するには、コントローラーのアノテーション内でパスを中括弧 { } で囲みます。この中に入れた名前が、Javaのメソッド引数と紐付くことになります。

例えば、ユーザーIDを受け取りたい場合は /users/{id} と記述します。このように設定することで、ブラウザから特定のID付きでアクセスがあった際に、Micronautが自動的にその値を読み取ってくれます。非常に直感的で、URLの見た目そのままにプログラムを記述できるのがMicronautの魅力です。まずは基本となるユーザーIDの取得例を見てみましょう。


package com.example;

import io.micronaut.http.annotation.Controller;
import io.micronaut.http.annotation.Get;

@Controller("/users")
public class UserController {

    // {id} の部分がパスパラメータになります
    @Get("/{id}")
    public String show(String id) {
        return "ユーザーID: " + id + " の詳細を表示します。";
    }
}

(アクセス例:http://localhost:8080/users/123)
ユーザーID: 123 の詳細を表示します。

3. 数値型のパスパラメータを扱う

3. 数値型のパスパラメータを扱う
3. 数値型のパスパラメータを扱う

URLから受け取る値は、必ずしも文字列(String型)である必要はありません。Micronautは、受け取ったパスパラメータを適切なデータ型に自動で変換してくれる「型変換機能」を持っています。

例えば、データベースのIDが数値(Long型やint型)であれば、メソッドの引数にその型を指定するだけで、Micronautが文字列から数値への変換を肩代わりしてくれます。もし数字以外の文字がURLに入力された場合は、適切なエラーを返してくれるため、自分で変換処理やチェック処理を細かく書く手間が省けます。これにより、コードがより安全で読みやすくなります。


package com.example;

import io.micronaut.http.annotation.Controller;
import io.micronaut.http.annotation.Get;

@Controller("/products")
public class ProductController {

    // 引数に Long 型を指定することで自動変換されます
    @Get("/{productId}")
    public String getProduct(Long productId) {
        return "商品番号 " + productId + " の在庫を確認しました。";
    }
}

(アクセス例:http://localhost:8080/products/550)
商品番号 550 の在庫を確認しました。

4. 複数のパスパラメータを組み合わせる

4. 複数のパスパラメータを組み合わせる
4. 複数のパスパラメータを組み合わせる

実際の開発では、URLの中に複数のパラメータを含めたい場面も多いでしょう。例えば、「特定のブログ記事のコメント」を表示する場合、 /blog/{blogId}/comments/{commentId} のように、二つのIDを同時に扱う必要があります。

Micronautでは、中括弧を複数使うことで、簡単に複数のパラメータを受け取ることができます。メソッドの引数名と中括弧の中の名前を合わせるだけで、どの値がどの変数に入るかを自動で判別してくれます。パスの順序も自由自在なので、階層構造を持つWebAPI(ウェブエーピーアイ)を作成する際に非常に便利です。以下の例で、その柔軟性を確認してみましょう。


package com.example;

import io.micronaut.http.annotation.Controller;
import io.micronaut.http.annotation.Get;

@Controller("/archive")
public class ArchiveController {

    // 年(year)と月(month)の二つのパラメータを受け取ります
    @Get("/{year}/{month}")
    public String findByMonth(int year, int month) {
        return year + "年" + month + "月のアーカイブ一覧を表示します。";
    }
}

(アクセス例:http://localhost:8080/archive/2026/02)
2026年2月のアーカイブ一覧を表示します。

5. オプションのパスパラメータ

5. オプションのパスパラメータ
5. オプションのパスパラメータ

場合によっては、パスパラメータがあってもなくても動くようにしたい、というケースがあります。これは「オプションパラメータ」と呼ばれます。Micronautでは、メソッドの引数に java.util.Optional を使うか、または @Nullable アノテーションを付けることで、値が存在しない場合にも対応できます。

ただし、パスの一部そのものが欠落するとURLが一致しなくなるため、パスの設計には注意が必要です。一般的には、オプションの情報は「クエリパラメータ(?以降に付くもの)」で扱うことが多いですが、パスとして定義しておきつつプログラム側で柔軟に処理を受け止める方法を知っておくと、より高度なWebデザインが可能になります。初心者のうちは、まずは必須のパラメータから練習するのが良いでしょう。

6. 型変換エラーへの対応とバリデーション

6. 型変換エラーへの対応とバリデーション
6. 型変換エラーへの対応とバリデーション

パスパラメータで数値を期待しているのに、ユーザーが「abc」などの文字をURLに入力してしまった場合、Micronautは自動的に「400 Bad Request」というエラーを返します。これは「リクエストが間違っていますよ」という合図です。Javaの標準的なエラーハンドリングを学ぶことで、これらのエラーが発生した際に独自のメッセージを画面に出すことも可能です。

また、パラメータの値が特定の範囲内(例えば1以上100以下など)であるかを確認する「バリデーション」という機能も備わっています。これらを組み合わせることで、意図しないデータがシステムに入り込むのを防ぎ、堅牢(けんろう)なアプリケーションを作ることができます。デバッグ(間違い探し)の際も、型がしっかり決まっていることは大きな助けになります。

7. 予約語や特殊文字を含むパスパラメータ

7. 予約語や特殊文字を含むパスパラメータ
7. 予約語や特殊文字を含むパスパラメータ

パスパラメータにスラッシュ / を含めたい場合はどうすれば良いでしょうか?通常、スラッシュはパスの区切りとして扱われるため、パラメータの中身にスラッシュが入ると正しく解析されません。これには「ワイルドカード」という特殊な書き方があります。

例えば、ファイルパスのような階層構造をそのままパラメータとして受け取りたいときは、 {/path*} のように記述します。これにより、残りのパス全体を一つの文字列として取得することができます。少し特殊な使い方ですが、ファイル管理システムや複雑な検索機能を構築する際には非常に重宝するテクニックです。基本をマスターした後のステップアップとして覚えておくと良いでしょう。


package com.example;

import io.micronaut.http.annotation.Controller;
import io.micronaut.http.annotation.Get;

@Controller("/files")
public class FileController {

    // 残りのパスをすべて受け取ります
    @Get("/{/filePath*}")
    public String download(String filePath) {
        return "ファイルパス: " + filePath + " をダウンロードします。";
    }
}

(アクセス例:http://localhost:8080/files/documents/2026/memo.txt)
ファイルパス: documents/2026/memo.txt をダウンロードします。

8. パスパラメータとセキュリティ

8. パスパラメータとセキュリティ
8. パスパラメータとセキュリティ

パスパラメータを使う際に、最も気をつけなければならないのがセキュリティです。URLに含まれる情報は誰にでも見えてしまいます。そのため、パスパラメータにパスワードや個人情報などの機密データを直接含めてはいけません。

また、受け取ったパラメータをそのままデータベースの検索などに使う場合、悪意のある入力によってシステムが攻撃されるリスクがあります。Micronautはこうした攻撃(SQLインジェクションなど)に対して強い仕組みを持っていますが、開発者自身も「送られてくる値は信用できない」という意識を持って設計することが大切です。常に安全なID(ランダムな文字列など)を使うといった工夫も効果的です。

9. ルーティングの優先順位を知る

9. ルーティングの優先順位を知る
9. ルーティングの優先順位を知る

複数のURL設定がある場合、Micronautはどの設定を優先して使うのでしょうか?基本的には、より「具体的」な指定が優先されます。例えば、 /users/admin という固定のパスと、 /users/{id} というパラメータ付きのパスがあった場合、 /users/admin へのアクセスは、パラメータではなく固定パスのメソッドに誘導されます。

この優先順位を理解しておかないと、「特定のIDだけ違う動きをさせたいのに、汎用的な処理に吸い込まれてしまう」といったトラブルが起きます。Micronautは賢くこれらを判定してくれますが、URLを設計する際には、曖昧さを排除した分かりやすい命名を心がけることが、メンテナンス性の高いプログラムへの近道となります。

関連記事:
カテゴリの一覧へ
新着記事
New1
Micronaut
Micronautの@Factoryとは?複雑なBean生成を管理するための方法を解説
New2
Quarkus
QuarkusのDIとCDIを完全理解!@Producesでプロデューサーメソッドを使う方法を初心者向けに解説
New3
Java
JavaのStringBufferクラスを徹底解説!スレッド安全な文字列操作の仕組みと使い分け
New4
Micronaut
Micronautで非同期HTTP処理を行う方法!リアクティブ対応の基礎知識
人気記事
No.1
Java&Spring記事人気No1
Quarkus
Quarkus入門!GitHub ActionsでCI/CDパイプラインを構築して自動ビルドを実現する方法
No.2
Java&Spring記事人気No2
Java
Javaのコンパイルと実行の流れを解説!JVM・JDK・JREの違いも初心者向けに整理
No.3
Java&Spring記事人気No3
Quarkus
QuarkusのCI/CD入門!GitHub Actionsで自動デプロイを実現する方法
No.4
Java&Spring記事人気No4
Micronaut
Micronautのルーティング設定ガイド!プレフィックス付与とAPIバージョニングの基本
No.5
Java&Spring記事人気No5
Micronaut
Micronautのフィルタ徹底解説!HTTPリクエスト共通処理をスマートに追加する方法
No.6
Java&Spring記事人気No6
Java
Java Optional ifPresentの使い方を徹底解説!nullチェックをスマートに省略する方法
No.7
Java&Spring記事人気No7
Java
Java Functionインタフェースの使い方を完全ガイド!map変換と処理チェーンを理解する
No.8
Java&Spring記事人気No8
Java
JavaのString比較を徹底解説!equalsと==の違い、初心者が陥る罠とは?