@Named注入在匕首中不能正常工作



当我像下面这样注入对象时,它可以正常工作

@Provides
@Singleton
public CommandObject getCommandObject(final Command command) {
...
}

但是一旦我在上面添加@Named,它就开始给出错误

commanddobject不能在没有@Inject构造函数或@ providers注释方法的情况下提供

我在这里错过了什么?

@Named是一个"限定符注释";它通常接受一个String值作为参数。这意味着Dagger将这三个键视为单独的键:

CommandObject
@Named("foo") CommandObject
@Named("bar") CommandObject

一旦你添加@Named到你的CommandObject,它不再是一个简单的未注释的CommandObject,就dagger而言,所以dagger告诉你,你现有的一个注入请求的CommandObject是缺少它的@Provides方法。(请求未命名的CommandObject的确切位置在"无法提供"旁边的完整错误消息中);)

  • 如果你需要一个以上的commanddobject在你的图形和你想区分他们的名称,添加一个匹配的@Named@Inject字段或构造函数参数旁边的commanddobject。
  • 如果你的意思是@Named只是为了文档,删除它并使用JavaDoc或其他技术。
  • 最后,如果您不想使用String来区分CommandObjects,您可以创建自己的Qualifier注释,如@Named,具有更多参数或IDE自动完成的可能性。上面链接的Dagger开发指南提供了一些说明,包括@Named本身的简单定义,以便进行比较。

我注入要使用的CommandObject的地方,没有提到那里的@Named。修正了

早些时候
@Inject
public CreateObjectImpl(final ObjectMapper objectMapper,
final CommandObject commandObject) {
this.objectMapper = objectMapper;
this.commandObject = commandObject;
}

修复后:

@Inject
public CreateObjectImpl(final ObjectMapper objectMapper,
@Named("commandObject") final CommandObject commandObject) {
this.objectMapper = objectMapper;
this.commandObject = commandObject;
}

最新更新