@Inject for Constructor的问题

时间:2015-12-10 06:07:31

标签: java android guice inject roboguice

我是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

不确定我哪里出错,也找不到太多帮助。 有人可以帮我解决问题。

由于

2 个答案:

答案 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构造函数?容器在创建对象时应该选择哪一个?