【问题标题】:Guice binding not done with @Named annotation没有使用 @Named 注释完成 Guice 绑定
【发布时间】:2016-11-18 21:27:04
【问题描述】:

我有以下构造函数

@Inject
public MyClass(Provider<TestClass> testProvider, @Named("myName") String name) {
  //constructor stuff
}

我的模块:

@Provides
@Named("myName")
public String getName(SomeObject object) {
    return object.getName();
}

问题在于 Guice 不进行绑定。

现在,如果我删除 @Named 注释,它就可以工作了。 getName() 方法被成功调用。当添加 @Named 注释时,getName() 从未被调用,我的构造函数最终被注入一个空字符串。

我只有一个用@Provides 注释的方法返回String,但我仍然想命名它,因为String 是一个非常常见的可以注入的对象。

我还尝试了 configure() 方法中的绑定(根据文档,但仍然没有。

有人知道我错过了什么吗?我检查了文档无济于事。

编辑:我确定我的导入是正确的

【问题讨论】:

  • 您的代码看起来非常合理;您正确使用了Named。您是否 100% 确定这不是过时的构建工件或未保存的文件?
  • 仔细检查您对Named 注释的导入。
  • 这些是我的导入:import com.google.inject.name.Named; 很奇怪。我将尝试更多故障排除。也许我的环境有问题
  • 请发布minimal reproducible example,发布的代码看起来正确,下面的答案证明我们无法复制它。有些事情你没有告诉我们。

标签: java annotations guice named


【解决方案1】:

为我工作。这是我用来验证的代码(guice 4.0):

package guice;

import com.google.inject.*;
import com.google.inject.name.Named;


public class Main {
    public static void main(String[] args) {
        Guice.createInjector(new MyModule()).getInstance(MyClass.class);
    }
}

class MyClass {
    @Inject
    public MyClass(Provider<TestClass> testProvider, @Named("myName") String name) {
        System.out.println(name);
    }
}

class MyModule extends AbstractModule {
    @Override
    protected void configure() {
    }

    @Provides
    @Named("myName")
    public String getName(SomeObject object) {
        return object.getName();
    }
}

class SomeObject {
    public String getName() {
        return "helloWorld";
    }
}

class TestClass {
}

按预期打印“helloWorld”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多