2015-07-23 16 views
24

Dưới đây là vấn đề,nhà cung cấp @Named với kiểu trả về cùng kết thúc cho java.lang.IllegalArgumentException: Duplicate

tôi đang làm việc trên một dự án LibGDX nơi mà tôi có mô-đun khác nhau cho các nền tảng khác nhau.

Đây là cách mô-đun Android của tôi trông giống như:

@Module(
    includes = {BaseModule.class, NetModule.class}, 
    injects = {DummyProjectActivity.class, DummyProject.class}, 
    overrides = true) 
public class DummyProjectAndroidModule { 

    ... 

    @Provides @Singleton @Named("DummyOne") 
    DummyInterface provideDummyOne() { 
     return new DummyOne(); 
    } 

    @Provides @Singleton @Named("DummyTwo") 
    DummyInterface provideDummyTwo() { 
     return new DummyTwo(); 
    } 

    @Provides @Singleton @Named("DummyConsumer") 
    DummyConsumer provideDummyConsumer(@Named("DummyOne") DummyInterface dummyOne, 
            @Named("DummyTwo") DummyInterface dummyTwo) { 
     return new DummyConsumer(dummyOne, dummyTwo); 
    } 
} 

.. và đây như thế nào mô-đun máy tính để bàn của tôi trông giống như:

@Module(
    includes = {BaseModule.class, NetModule.class}, 
    injects = {DummyProjectDesktop.class, DummyProject.class}, 
    overrides = true) 
public class DummyProjectDesktopModule { 

cũng còn lại là khá nhiều giống nhau. Tuy nhiên, trong khi tôi đang xây dựng các dự án cho tất cả mọi thứ Desktop đi tốt đẹp và dandy nơi trên Android bên, tôi nhận được lỗi này mà tôi lại flabbergasted vẫn còn.

Process: net.alicanhasirci.mobile.DummyProject.android, PID: 4603 
    java.lang.RuntimeException: Unable to start activity ComponentInfo{net.alicanhasirci.mobile.DummyProject.android/net.alicanhasirci.mobile.DummyProject.android.DummyProjectActivity}: java.lang.IllegalArgumentException: Duplicate: 
    net.alicanhasirci.mobile.android.image.DummyInterface net.alicanhasirci.mobile.DummyProject.android.DummyProjectAndroidModule.provideDummyOne() 
    net.alicanhasirci.mobile.android.image.DummyInterface net.alicanhasirci.mobile.DummyProject.android.DummyProjectAndroidModule.provideDummyTwo() 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2305) 
      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2365) 
      at android.app.ActivityThread.access$800(ActivityThread.java:148) 
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1283) 
      at android.os.Handler.dispatchMessage(Handler.java:102) 
      at android.os.Looper.loop(Looper.java:135) 
      at android.app.ActivityThread.main(ActivityThread.java:5272) 
      at java.lang.reflect.Method.invoke(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:372) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:909) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:704) 
    Caused by: java.lang.IllegalArgumentException: Duplicate: 
    net.alicanhasirci.mobile.android.image.DummyInterface net.alicanhasirci.mobile.DummyProject.android.DummyProjectAndroidModule.provideDummyOne() 
    net.alicanhasirci.mobile.android.image.DummyInterface net.alicanhasirci.mobile.DummyProject.android.DummyProjectAndroidModule.provideDummyTwo() 
      at dagger.internal.UniqueMap.put(UniqueMap.java:29) 
      at dagger.internal.plugins.reflect.ReflectiveModuleAdapter.handleBindings(ReflectiveModuleAdapter.java:104) 
      at dagger.internal.plugins.reflect.ReflectiveModuleAdapter.getBindings(ReflectiveModuleAdapter.java:89) 
      at dagger.ObjectGraph$DaggerObjectGraph.makeGraph(ObjectGraph.java:174) 
      at dagger.ObjectGraph$DaggerObjectGraph.access$000(ObjectGraph.java:132) 
      at dagger.ObjectGraph.create(ObjectGraph.java:129) 
      at net.alicanhasirci.mobile.DummyProject.android.DummyProjectActivity.onCreate(DummyProjectActivity.java:137) 
      at android.app.Activity.performCreate(Activity.java:5977) 
      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105) 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2258) 

bây giờ là một cái nhìn thoáng qua nhanh mã nguồn dao găm và tôi có thể thấy rằng chú thích vòng loại được tập hợp bởi phản xạ và làm quen như tiền tố cho ràng buộc tên mà sau này sẽ được sử dụng như phím trong UniqueMap. Vấn đề của tôi dường như xảy ra ở đâu đó xung quanh khu vực này, nơi vòng loại của tôi không được xử lý bằng cách nào đó, tuy nhiên máy tính để bàn của tôi xây dựng các công trình mà không có một vấn đề ...

Dưới đây là một số bổ sung thêm:

ObjectGraph objectGraph = ObjectGraph.create(new DummyProjectAndroidModule()); 
    objectGraph.inject(this); 
    dp = objectGraph.get(DummyProject.class); 

là làm thế nào tôi có được đối tượng DummyProject của tôi, có một trường tiêm DummyConsumer. Như vậy:

@Inject @Named("DummyConsumer") DummyConsumer consumer; 

Tôi đã thay đổi các loại trở lại lớp bê tông như một cách giải quyết nhưng không ai thích một cách giải quyết nguyên nhân chúng ta đều biết rằng họ ám ảnh bạn cho đến tận cùng.

+4

Vui lòng nâng cấp lên phiên bản Dagger mới hơn. –

Trả lời

0

Cuối cùng tôi đã tìm ra lý do tại sao sự cố này xảy ra. Đó là Proguard. Trừ khi bạn nói chỉ định khác trong tập tin cấu hình proguard, nó sẽ làm xáo trộn mã được tạo ra trong khi cắt tỉa các chú thích và những thứ không gây ra các kết quả không mong muốn.

Cách duy nhất để làm cho Proguard và Dagger cùng tồn tại là về cơ bản từ bỏ hầu hết các obfuscation hoặc chuyển sang Dagger2, như Jake Wharton nói trên https://github.com/square/dagger/issues/202. Tôi đang sử dụng proguard chỉ để tránh đạt giới hạn 65k để làm cho các cấu hình cần thiết để tránh obfuscation giải quyết vấn đề của tôi.

Các vấn đề liên quan