【问题标题】:Binding a Set<String> in Guice在 Guice 中绑定一个 Set<String>
【发布时间】:2019-03-15 22:25:28
【问题描述】:

我想像这样在 Guice 中绑定一个 Set:

public class TestModule extends AbstractModule {
    @Override
    protected void configure() {
        Set<String> testSet = Sets.newHashSet("Hello", "World");
        bind(Set.class).annotatedWith(Named.named("Test.Set")).toInstance(testSet);
    }
}

我已确保在创建注入器时包含此模块。我稍后尝试使用此绑定集:

public class TestClass {
    @Inject
    public NewReleaseRunner(@Named("Test.Set") Set<String> testSet) {
        System.out.println(testSet.toString());
    }
}

但是,这会导致失败:No implementation for java.util.Set&lt;java.lang.String&gt; annotated with @com.google.inject.name.Named(value=Test.Set) was bound.

我担心Set&lt;String&gt; 是通用的,但绑定到Set.class。我可以做些什么来解决这个问题?

【问题讨论】:

  • 您是否尝试过在模块中的方法上使用@Provides 而不是在配置中绑定?该方法可以指定提供Set&lt;String&gt;
  • @MyStackRunnethOver 使用 @Provides 将按需要工作,但与我们代码库的其余部分的代码约定不同

标签: java guice


【解决方案1】:

我认为你有两个选择。替换

bind(Set.class).annotatedWith(Named.named("Test.Set")).toInstance(testSet);

bind(new TypeLiteral<Set<String>>() {}).annotatedWith(Named.named("Test.Set")).toInstance(testSet);

或者移除模块的configure()绑定,改为添加

@Provides
@Named("Test.Set")
public Set<String> stringSet() {
    return Sets.newHashSet("Hello", "World");
}

【讨论】:

  • 谢谢!我在附近看到了 TypeLiteral,但不确定如何使用它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多