当我像下面这样注入对象时,它可以正常工作
@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;
}