Привязка набора <String>в Guice - PullRequest
0 голосов
/ 16 марта 2019

Я хочу связать Set в Guice следующим образом:

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<java.lang.String> annotated with @com.google.inject.name.Named(value=Test.Set) was bound.

Меня беспокоит то, что Set<String> является общим, но привязка кSet.class.Что я могу сделать, чтобы решить эту проблему?

1 Ответ

3 голосов
/ 16 марта 2019

Я думаю, у вас есть два варианта.Замените

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");
}
...