【问题标题】:Issue with @Inject for Constructor构造函数的@Inject 问题
【发布时间】:2015-12-10 06:07:31
【问题描述】:

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

不确定我哪里出错了,也找不到太多帮助。 谁能帮我解决这个问题。

谢谢

【问题讨论】:

  • 请查看代码示例(PreviouslyFacing issue for)。签名是 100% 相同的 AFAICT
  • @Grogi。谢谢!我现在更正了
  • "Could not find a suitable constructor in com.j256.ormlite.dao.RuntimeExceptionDao" 那么该类有哪些构造函数呢?
  • @TavianBarnes:我错过了一些数据库类的默认构造函数。对于 ORMlite,这些是强制性的。

标签: java android guice inject roboguice


【解决方案1】:

我的代码中遗漏了两件事。我的数据库类缺少默认构造函数。 Ormlite 需要默认构造函数,而我的某些类中缺少这些构造函数。之后,我错过了 Db 注释依赖项的绑定,如下所示:

    bind(new TypeLiteral<RuntimeExceptionDao<MyTable, Long>>() {}).toProvider(new DaoProvider<MyTable, Long>(MyTable.class));

在这些更改之后,问题得到了解决。

感谢大家的帮助!

【讨论】:

    【解决方案2】:

    首先 - 虽然这没有明确回答您的问题,但不能有这两个构造函数 - 在类型擦除之后它们是相同且无法区分的。

    您需要明确定义类,例如

    RuntimePlotExceptionDao extends RuntimeExceptionDao<Plot, String>
    RuntimeLocalPlotDateExceptionDao extends RuntimeExceptionDao<LocalPlotData, Long>
    

    其次 - 为什么要拥有两个 @Inject 构造函数?创建对象时容器应该选择哪一个?

    【讨论】:

    • 我调试并得到了下面的堆栈跟踪
    猜你喜欢
    • 1970-01-01
    • 2011-08-23
    • 2021-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多