Java 从静态内部类对CDI注入的外部类进行私有访问时出错
在JBoss EAP 6.0.1中,我有以下CDI管理的bean(最低版本)Java 从静态内部类对CDI注入的外部类进行私有访问时出错,java,cdi,jboss-weld,weld,Java,Cdi,Jboss Weld,Weld,在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); } p
@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");
}
}
}
我得到的输出是:
Values: {}
在那里我会期望值foo
进一步的调查显示,调用private void addValue
访问values
属性的一个版本,该属性位于Weld生成的Outer
代理中,而调用public void printValues
访问真实托管bean实例的真实属性
让事情变得更加混乱:如果我将addValue
的访问级别更改为package
中的一个,protected
或public
一切正常
但在我的例子中,内部类的目的是使该方法成为私有的,以便外部的其他CDI客户机不能调用该方法。现在这是唯一不起作用的东西:D
知道怎么了吗?这是Weld中的一个bug吗?目前所有CDI提供程序都使用代理(这不是规范所要求的,但这三个IMPL都是这样做的)来注入任何非伪作用域对象。如果Outer是
@dependent范围的
,我很确定它会按照您希望的方式工作。创建的代理自然是类的子类,因此在注入对象上调用私有方法是行不通的。老实说,我很惊讶它没有爆炸。在进一步阅读之后,我想对这种行为的解释在于java创建和使用Synthetic访问器方法来访问外部类的私有成员的方式。
Values: {}