可以抑制豆类注入吗?

时间:2019-01-14 10:11:45

标签: java wildfly weld

我有一个要在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不要在此注入点尝试注入任何东西?

谢谢。

2 个答案:

答案 0 :(得分:2)

可能矫kill过正,但是您可以创建一个producer并始终为该null返回class

@ApplicationScoped
public class YProducer {

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

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

答案 1 :(得分:0)

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

@Inject
private Optional<Y> y;

最大的区别是y永远不会为null! 然后,您可以通过这种方式简单地测试其存在:

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

使用javax.enterprise.inject.Instance

的其他可能性
@Inject
private Instance<Y> instance;

try {
   y = instance.get();
} catch (Exception e) {
}