Можно ли подавить инъекцию бобов? - PullRequest
0 голосов
/ 14 января 2019

У меня есть веб-приложение, которое должно быть развернуто на Wildfly 12. В приложение входит сторонняя фляга с кодом, подобным следующему

class X
{
    @Inject private Y y = null;

    public void someMethod()
    {
        if (y == null)
            doSomething();
        else
            doSomethingElse(y);
    }
}

Понятно, что код был написан в предположении, что внедрение может завершиться неудачей и y может быть null.

Однако Weld это не нравится, и я получаю ошибку развертывания, в которой говорится о неудовлетворенном недостатке y. Я не могу изменить сторонний код и не хочу указывать зависимость для y. Я бы хотел, чтобы ветка doSomething() была взята.

Можно ли сказать, что Weld не пытается вводить что-либо в этой точке впрыска?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Я думаю, что есть гораздо более элегантное решение (в Java8), использующее преимущества нового класса Optional:

@Inject
private Optional<Y> y;

Большая разница в том, что y никогда не будет нулевым! И тогда вы можете просто проверить его наличие следующим образом:

if ( y.isPresent() ) {
   doSomethingElse(y);      
} else {
   doSomething();
}

Другая возможность использования javax.enterprise.inject.Instance

@Inject
private Instance<Y> instance;

try {
   y = instance.get();
} catch (Exception e) {
}
0 голосов
/ 14 января 2019

Может быть излишним, но вы можете создать producer, который всегда возвращает null для этого class:

@ApplicationScoped
public class YProducer {

    @Produces
    @RequestScoped  
    public Y create() {
        return null;
    }

    public void destroy(@Disposes Y y) {
        //no-op
    }
}
...