我有一个要在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不要在此注入点尝试注入任何东西?
谢谢。
答案 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) {
}