Guice CreationException - Никакая реализация для типа Foo не была связана - PullRequest
2 голосов
/ 13 августа 2011

Нужна помощь, чтобы понять эту ошибку и возможные пути ее устранения.

Итак, у меня есть такой тип:

class Foo {
   static final class Bar {}

   @Inject
   Foo(TypeA a, @Nullable Set<Bar> b) {}
}

Чтобы сделать Foo инъекционным, мне нужно выполнить зависимость для параметры a и b, теперь у меня нет проблем с предоставлением типа a реализация, это не нуль, поэтому у меня есть метод @Provides в Пакеты модулей класса. Но как насчет б? Это обнуляемый, как писать @ Предоставляет параметр, который может быть обнуляемым? Я думаю это не должно быть обязательным, и Guice должен понимать аннотацию ... Но что-то не работает правильно, я получил эту ошибку:

1) Нет привязки к реализации java.util.Set<Foo$Bar>.

А вот метод @Provides (который не работал на АТМ)

@Provides @Nullable
public Foo provideFoo(TypeA a, @Nullable Set<Foo.Bar> b) {
    return new Foo(a, b);
}

Я знаю, что вложенный класс не является ни публичным, ни конструктором, поэтому, возможно, Guice не может получить к нему доступ, но даже если я сделаю их всех публичными (что я не очень хочу) ошибка все еще остается ... Есть ли что-то я отсутствует?

1 Ответ

0 голосов
/ 13 августа 2011

Существует разница между отсутствием привязки для Set<Bar> и привязкой для Set<Bar>, то есть null.

Вам понадобится метод @Provides, который возвращает Set<Bar> (это может быть null) или что-то вроде bind(Bar.class).toProvider(Providers.ofInstance(null)), чтобы иметь возможность предоставить второй параметр конструктору Foo.

Также обратите внимание, что ваш @Provides метод для Foo просто вызывает аннотированный конструктор @Inject напрямую, поэтому он вообще не нужен. Я также сказал бы, что было бы предпочтительнее связать с пустым Set<Bar>, чем с null.

...