是否可以抑制bean注入?

Is it possible to suppress bean injection?

我有一个要部署在 Wildfly 12 上的 Web 应用程序。该应用程序中包含一个第三方 jar,其代码类似于以下内容

class X
{
    @Inject private Y y = null;

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

很明显,代码是在注入可能失败的假设下编写的,y可以是null

但是 Weld 不喜欢这样,我收到一个部署错误,指出 y 有一个不满意的依赖项。我无法修改第三方代码,也不想为 y 提供依赖项。我想要 doSomething() 分支。

是否可以告诉 Weld 不要尝试在此注入点注入任何东西?

谢谢。

可能有点矫枉过正,但您可以创建一个始终 returns nullproducer class:

@ApplicationScoped
public class YProducer {

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

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

我认为有更优雅的解决方案(在 Java8 中)利用新的 Optional class:

@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) {
}