Java 是否有可能抑制豆类注射?
我有一个web应用程序将部署在Wildfly 12上。应用程序中包含一个第三方jar,其代码类似于以下内容Java 是否有可能抑制豆类注射?,java,wildfly,weld,Java,Wildfly,Weld,我有一个web应用程序将部署在Wildfly 12上。应用程序中包含一个第三方jar,其代码类似于以下内容 class X { @Inject private Y y = null; public void someMethod() { if (y == null) doSomething(); else doSomethingElse(y); } } 很明显,编写代码的前提是注入
class X
{
@Inject private Y y = null;
public void someMethod()
{
if (y == null)
doSomething();
else
doSomethingElse(y);
}
}
很明显,编写代码的前提是注入可能会失败,y
可能是null
然而,Weld不喜欢这样,我得到一个部署错误,说y
有一个不满意的缺陷。我无法修改第三方代码,也不想为y
提供依赖项。我希望执行doSomething()
分支
是否可以告诉Weld不要尝试在该注射点注射任何东西
谢谢。可能有些过分,但是您可以创建一个
生产者
,为该类
始终返回null
:
@ApplicationScoped
public class YProducer {
@Produces
@RequestScoped
public Y create() {
return null;
}
public void destroy(@Disposes Y y) {
//no-op
}
}
我认为有更优雅的解决方案(在Java8中)利用了新的
可选类:
@Inject
private Optional<Y> y;
使用javax.enterprise.inject.Instance的其他可能性
@Inject
private Instance<Y> instance;
try {
y = instance.get();
} catch (Exception e) {
}
@Inject
私事;
试一试{
y=instance.get();
}捕获(例外e){
}
您可以让它抛出空指针异常,从外部捕获它,然后从那里启动“doSomething”?-也许这是一个愚蠢的猜测。@AsierAranbarri没有NPE。当Weld“验证”注入点时,错误发生在展开时。它确定它不能满足依赖关系并停止部署。这是一个愚蠢的猜测:(谢谢。我必须做一些更改才能使其正常工作。我用ManagedBean替换了应用程序(奇怪,因为Weld文档说明ManagedBean是可选的)我必须删除RequestScope。这意味着Y的所有注入都将为null,而不仅仅是我上面提到的,对吗?我想我可以接受,但我需要调查。没错,制作人将负责此类的所有@注入。我不确定你是否能在这个产品中做些聪明的事情cer逻辑,以了解是返回null
还是根据上下文构造Y实例。问题是我无法修改第三方代码。
@Inject
private Instance<Y> instance;
try {
y = instance.get();
} catch (Exception e) {
}