2017-10-26 1 views
0

私は、これらのクラスを持っている:このように、パスのみを提供するのが妥当と思われるDagger 2で注釈を伝播することはできますか?

class Storage { 
    @Qualifier 
    @Retention(RetentionPolicy.SOURCE) 
    @Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER}) 
    public @interface Songs {} 

    @Qualifier 
    @Retention(RetentionPolicy.SOURCE) 
    @Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER}) 
    public @interface Movies {} 

    @Inject 
    public Storage(
    @Songs Blobstore songsStore, 
    @Movies Blobstore moviesStore) { 
// ... 
} 

class Blobstore { 
    @Inject 
    public Blobstore(File path) { 
// ... 

@Provides 
@Songs 
public static File songPath() { return new File("/sdcard/songs"); } 
@Provides 
@Movies 
public static File moviePath() { return new File("/sdcard/movies"); } 

しかし、私はこれを行う場合、私はエラーメッセージが表示されます:File is bound multiple times。これを修正する方法はありますか?

+1

は '@ Songs' a' @ Qualifier'ですか? – EpicPandaForce

+0

@EpicPandaForce「@曲」を「@修飾子」にすることができます。それでも同じメッセージで失敗します。 – Lev

+0

'@interface Songs'に' @ Qualifier'を付けるか、モジュールで置き換えましたか?修飾子を正しく使用すると動作します。そうでない場合は、コードで質問を更新してください。 –

答えて

0

あなた@Qualifier注釈need to be runtime-retained to comply with JSR-330(強調鉱山):

修飾子注釈:

  • は、@Qualifierでアノテートさ@Retention(RUNTIME)、そして一般的に@Documentedされます。
  • [...]

もののダガーコード生成はコンパイル時に起こるが、それはまた、JSR-330、ダガーは非準拠修飾子注釈によって影響されないことを意味し遵守する必要があります。

+0

私はそうしました。新しいメッセージは 'ファイルは@Injectコンストラクタなしで提供することはできません。また、@ Provides-annotatedメソッドから提供することはできません.'そして' @SongsBlobstoreは@ Provides-annotatedメソッドなしでは提供できません。 ' – Lev

+0

@Levそれから動作します! Blobstoreに '@Inject'アノテーションがあり、あなたの修飾子が実際に動作するようになったら、' @SongsBlobstore'を 'Blobstore'に、' @MoviesBlobstore'を 'Blobstore'にバインドするか、実装やスコープをバインドする必要がありますあなたが必要です。 –

関連する問題