我(在简约版本中)JBoss EAP 6.0.1中的以下CDI托管bean
@ApplicationScoped
public class Outer {
private final List<String> values = new ArrayList<String>();
public void printValues() {
System.out.println("Values: " + values);
}
private void addValue(String value) {
values.add(value);
}
public static class Inner {
@Inject
private Outer outer;
public void addFoo() {
outer.addValue("foo");
}
}
}
以下代码来测试这个(不要质疑为什么。它只适用于这个展示。):
@Inject
Outer outer;
@Inject
Outer.Inner inner;
public void test() {
inner.addFoo();
outer.printValues();
}
我得到了输出:
Values: {}
我期望值foo。
进一步调查显示,对private void addValue
的调用访问了values
属性的版本,该属性位于Weld生成的代理Outer
中,而对public void printValues
的调用则访问真正的托管bean实例的真实属性。
让事情变得更加混乱:如果我将addValue
的访问级别更改为package
之一,protected
或public
,则一切都按预期工作。
但在我的情况下,内部类的目的是促进该方法是私有的,以便Outer的其他CDI客户端不能调用该方法。现在这是唯一不起作用的东西:D
知道什么是错的吗?这是Weld的错误吗?
答案 0 :(得分:1)
目前,所有CDI提供程序都使用代理(规范不要求,但这就是所有三个impl的完成方式),用于注入任何非伪范围对象。如果Outer是@DependantScoped
,我很确定它会按你想要的方式工作。创建的代理自然是类的子类,因此在注入的对象上调用私有方法是行不通的。老实说,我很惊讶它不会爆炸。