LoginSignup
2
2

More than 5 years have passed since last update.

KotlinでDagger2を使うときにInjectionが失敗する (RuntimeInvisibleParameterAnnotations)

Last updated at Posted at 2016-06-21

KotlinでDagger2を使ってDIするときにビルドに失敗するケースがあったので、そのメモです。根本的には解決しておらず、例外が出ないようにコードを書き換えて対応しました。Kotlinのバージョンは1.0.2、Dagger2は2.4です。

ビルドするとこんな例外

RuntimeInvisibleParameterAnnotations属性が不正です: ResourceType(String)
    削除するか、クラスパスの正しいサブディレクトリにあるかを確認してください。
  • なぜかDIと関係なさそうなクラスで怒られました。。。

これが起きる条件

  • この場合のResourceTypeはこんなEnumを書いてました
ResourceType.kt
enum class ResourceType(val typeId: Int, val typeName: String) {
    HOGE(0, "hoge"),
    FUGA(1, "fuga");
}
  • で、このenumをメンバ変数に持っているクラスに注入しようとすると上記の例外が発生しました。再現性もあります。
  • JetBrainsの最近のissueにも同様のケース(https://youtrack.jetbrains.com/issue/KT-10629) が上がっていて、kaptを使っている場合に、kaptが生成するファイルで使われるenumのコンストラクタがStringの引数を受け付けてると発生するみたいです。

とりあえずの解決

  • 外から指定するのではなくて、中でプロパティをOverrideするようにしました。
ResourceType.kt
enum class ResourceType(val typeId: Int) {
    HOGE(0) {
        override val typeName = "hoge"
    },
    FUGA(1) {
        override val typeName = "fuga"
    };

    abstract val typeName: String
}
2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2