我是robojuice的新手,但我需要处理一段已由其他人建造的代码。如果我将一个额外的参数添加到已经有@Inject的类的构造函数中,我将面临问题。我的android应用程序崩溃,给出了以下错误,没有关于该问题的详细描述:
"java.lang.RuntimeException: Unable to start activity ComponentInfo{com.my.app.envTest/com.my.app.navigation.NavigActivity}: com.google.inject.ConfigurationException: Guice configuration errors:"
我确定此错误与活动无关,但我将新参数添加到构造函数中。如果我删除该参数,它可以正常工作。
此前:
@Inject
public PlotRepo(RuntimeExceptionDao<Plot, String> plotDao, RuntimeExceptionDao<LocalPlotData, Long> localPlotDataDao) {
this.plotDao = plotDao;
this.localPlotDataDao = localPlotDataDao;
}
面对的问题:
@Inject
public PlotRepo(RuntimeExceptionDao<Plot, String> plotDao, RuntimeExceptionDao<LocalPlotData, Long> localPlotDataDao, RuntimeExceptionDao<LocalSelPlotData, Long> localSelPlotDataDao) {
this.plotDao = plotDao;
this.localPlotDataDao = localPlotDataDao;
this.localSelPlotDataDao = localSelPlotDataDao;
}
调试后我遇到了这个错误:
1) Could not find a suitable constructor in com.j256.ormlite.dao.RuntimeExceptionDao. Classes must have either one (and only one) constructor annotated with @Inject or a zero-argument constructor that is not private.
at com.j256.ormlite.dao.RuntimeExceptionDao.class(Unknown Source)
while locating com.j256.ormlite.dao.RuntimeExceptionDao<com.myapp.s.b.sets.domain.LocalSelPlotData, java.lang.Long>
for parameter 2 at com.tp.my.sets.PlotRepo.<init>(Unknown Source)
while locating com.myapp.s.b.sets.PlotRepo
for parameter 1 at com.myapp.s.b.GroupingManager.<init>(Unknown Source)
while locating com.myapp.s.b.GroupingManager
for field at com.myapp.s.b.navigation.NavigActivity.groupingManager(Unknown Source)
while locating com.myapp.s.b.navigation.NavigActivity
不确定我哪里出错,也找不到太多帮助。 有人可以帮我解决问题。
由于
答案 0 :(得分:1)
我的代码中遗漏了两件事。我的数据库类缺少默认构造函数。 Ormlite需要默认的构造函数,在我的一些类中缺少这些构造函数。之后,我错过了Db注释依赖项的绑定,如下所示:
bind(new TypeLiteral<RuntimeExceptionDao<MyTable, Long>>() {}).toProvider(new DaoProvider<MyTable, Long>(MyTable.class));
在这些更改后,问题得到解决。
谢谢大家的帮助!
答案 1 :(得分:0)
首先 - 尽管这并没有明确回答你的问题,但是不能有这两个构造函数 - 在Type Erasure之后它们是相同的并且难以区分。
您需要明确定义类,例如
RuntimePlotExceptionDao extends RuntimeExceptionDao<Plot, String>
RuntimeLocalPlotDateExceptionDao extends RuntimeExceptionDao<LocalPlotData, Long>
其次 - 为什么你想拥有两个@Inject
构造函数?容器在创建对象时应该选择哪一个?