具有相同返回类型的@Named提供程序最终会给出java.lang.IllegalArgumentException:重复

AlicanHasırcı:

这是问题

我正在一个LibGDX项目中工作,在该项目中,我具有适用于不同平台的不同模块。

这是我的android模块的样子:

@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);
    }
}

..以及我的桌面模块的外观如下:

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

好好休息几乎是一样的。但是,当我在为Desktop构建项目时,在Android方面一切都很好,但我遇到了这个错误,这让我仍然感到困惑。

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)

现在快速浏览dagger源代码,我可以看到限定符注释是通过反射收集的,并用作绑定名称的前缀,这些名称以后将用作UniqueMap中的键。我的问题似乎发生在该区域附近的某个地方,我的限定符未得到任何处理,但是我的桌面构建仍然可以正常工作...

这里还有一些其他内容:

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

这是我如何获取DummyProject对象的方法,该对象的电场注入为DummyConsumer因此:

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

我已将返回类型更改为具体类,以作为一种解决方法,但没人喜欢这种解决方法,因为我们都知道它们一直困扰着您直到最后。

AlicanHasırcı:

我终于弄清楚了发生此问题的原因。是Proguard。除非您在proguard配置文件中另外指定,否则它将在修剪注释时混淆生成的代码,否则将导致意外结果。

就像Jake Wharton在https://github.com/square/dagger/issues/202上说的那样,使Proguard和Dagger共存的唯一方法是基本上放弃大部分混淆或切换到Dagger2 我使用proguard只是为了避免达到65k的限制,因此进行必要的配置以避免混淆会解决我的问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

java.lang.IllegalArgumentException异常:重复处理程序名称:解码器,网状的http服务器

java.lang.IllegalArgumentException:空键

java.lang.IllegalArgumentException:无效的列名

java.lang.IllegalArgumentException:不能具有viewTypeCount <1

JPA:java.lang.IllegalArgumentException:不是实体

获取错误java.lang.IllegalArgumentException

XQuery Saxon异常(java.lang.IllegalArgumentException)

java.lang.IllegalArgumentException:错误引用的类型不是注释类型

java.lang.IllegalArgumentException:无法识别的类型:[null]

VolleyError:java.lang.IllegalArgumentException:超时<0

RuntimeException:具有MainActivity.onStart的java.lang.IllegalArgumentException

unregisterReceiver原因:java.lang.IllegalArgumentException

java.lang.IllegalArgumentException onActivityResult

java.lang.IllegalArgumentException:发布管理

奇怪的java.lang.IllegalArgumentException异常

java.lang.IllegalArgumentException:provider =网络

java.lang.illegalArgumentException意外显示

java.lang.IllegalArgumentException:未知实体

错误:java.lang.IllegalArgumentException

java.lang.IllegalArgumentException:无效的提供程序:null

错误:java.lang.IllegalArgumentException:发现意外的类型标记67

改造错误 - java.lang.IllegalArgumentException

java.lang.IllegalArgumentException:无效的键码

面对 java.lang.IllegalArgumentException

java.lang.IllegalArgumentException:nativePtr 为空

java.lang.IllegalArgumentException:不是托管类型:类

java.lang.IllegalArgumentException:无法创建组件

QuickSort 方法中的 java.lang.IllegalArgumentException

比较器错误 java.lang.IllegalArgumentException