是否可以抑制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 null
的 producer
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) {
}
我有一个要部署在 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 null
的 producer
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) {
}