Опциональная инъекция в Guice - PullRequest
4 голосов
/ 12 января 2011

Мне нужно ввести поле, только если оно доступно в текущей области, и ноль в противном случае.Например:

public class Thinger implements Provider<SomeSuch> {
    public @Inject(optional=true) HttpServletRequest request;        

    public SomeSuch get() {
        return request == null ? new WhosIt() : WhatsIt();
    }
}

Однако, если HttpServletRequest привязан (какой он есть), но не находится в области действия, я получаю ProvisioningException.Мне удалось найти изящный способ сделать это, поэтому я вынужден сделать что-то вроде.

HttpServletRequest request = null;
try {
    request = injector.getInstance(HttpServletRequest.class);
} catch(ProvisioningException e) {}

Что просто кажется неправильным.Есть ли правильный способ сделать это?

1 Ответ

3 голосов
/ 29 января 2011

Что именно определяет ваш класс, чтобы быть доступным?HttpServletRequest как-то нелогично для меня, так как отсутствие запроса в службе, не относящейся к области запросов, для меня звучит как ошибка.

Одна идея (в общем случае) состоит в том, чтобы написать собственный Поставщик для Держателяпросто метод get / set.В провайдере вы можете запускать проверки, независимо от того, доступна ли ваша вещь в текущей области, она всегда возвращает держатель нужного вам типа, но он может быть пустым / нулевым, в зависимости от того, что доступно.Поскольку вы всегда возвращаете держатель, с инжектором все должно быть в порядке.Вам просто нужно проверить нулевое значение в компоненте, в который вы вводите это.

Надеюсь, это поможет.

...