Skip to content

Spring Bootで発生するパラメータ名エラーの解決方法

問題の説明

Spring Boot 3.2.4にアップグレードした後、次のようなエラーが発生する場合があります:

Name for argument of type [java.lang.String] not specified, and parameter name information not available via reflection. Ensure that the compiler uses the '-parameters' flag

このエラーは次のようなコードで発生します:

java
@PutMapping("/{uid}/test/{state}")
@ResponseStatus(HttpStatus.NO_CONTENT)
public void update(
        Context context,
        @PathVariable String uid,      // パラメータ名情報なし
        @PathVariable String state      // パラメータ名情報なし
) throws RuntimeFunctionalException {
    this.service.updateState(uid, state, context);
}

エラーの原因

Spring Frameworkがメソッドパラメータ名を取得できないために発生します。主な原因は:

  • コンパイル時に-parametersフラグが指定されていない
  • @PathVariable@RequestParamで明示的にパラメータ名が指定されていない
  • 開発環境でパラメータ情報の保存が有効になっていない

解決方法

方法①: アノテーションで明示的にパラメータ名を指定

最も確実な方法は、@PathVariable@RequestParamに明示的に名前を指定することです:

java
@PutMapping("/{uid}/test/{state}")
@ResponseStatus(HttpStatus.NO_CONTENT)
public void update(
        @PathVariable("uid") String uid,      // 明示的に名前指定
        @PathVariable("state") String state   // 明示的に名前指定
) throws RuntimeFunctionalException {
    this.service.updateState(uid, state, context);
}

利点:

  • コンパイラ設定に依存しない
  • コードが明示的で可読性が向上
  • Springのバージョンアップ影響を受けにくい

方法②: ビルドツールで-parametersフラグを有効化

コンパイラにパラメータ名情報を保存させる方法です:

各ビルドツールの設定方法

Gradleの場合 (build.gradle):

groovy
tasks.withType(JavaCompile) {
    options.compilerArgs = ['-parameters']
    doFirst {
        println "Compiler args: ${options.compilerArgs}"
    }
}

Mavenの場合 (pom.xml):

xml
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
        <parameters>true</parameters> <!-- この設定が重要 -->
    </configuration>
</plugin>

設定後は必ずプロジェクトをクリーンビルドしてください。

方法③: IDE設定でパラメータ情報を保存 (VS Code例)

IDE固有の設定注意

この設定はビルドツールの設定ではなく、IDEの実行環境のみに影響します

  1. VS CodeでCtrl + ,で設定を開く
  2. java > configuration > runtime」を検索
  3. 「Java: Runtime Configuration」セクションを見つける
  4. 「Store information about method parameters」チェックボックスをオンにする

VS Codeでの設定画面


推奨解決策とベストプラクティス

  1. 優先すべき方法: アノテーションでの明示的な名前指定(方法①)

    • プロジェクト全体の設定に依存しないため最も安全
    • コードの意図が明確になるメリットあり
  2. プロジェクト全体で適用したい場合: ビルドツール設定(方法②)

  3. IDEのみの問題解決: 方法③

    • VS Codeでテスト実行時のみ問題が発生する場合の対処療法
    • 根本解決にはならないため注意

注意事項

  • ./gradlew bootRunで実行すると正常動作しても、IDEから実行すると失敗する場合があります
  • 異なる環境で動作させる場合は「方法① + 方法②」の併用が最堅固
  • Spring Boot 3.x 以上ではこの問題が顕在化しやすい

まとめ

対策方法設定箇所適用範囲永続性
アノテーションでの明示的指定ソースコード内個別メソッド★★★★★
ビルドツール設定build.gradle/pom.xmlプロジェクト全体★★★★☆
IDE設定IDE設定画面ローカル環境のみ★★☆☆☆

問題解決後も再発防止のため、新しいエンドポイント作成時には常に明示的にパラメータ名を指定する習慣をつけることをお勧めします。これにより、環境依存の問題を根本的に回避できます。