从静态内部类中私有访问CDI注入的外部类时出错

时间:2014-01-09 19:11:43

标签: 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);
    }

    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之一,protectedpublic,则一切都按预期工作。

但在我的情况下,内部类的目的是促进该方法是私有的,以便Outer的其他CDI客户端不能调用该方法。现在这是唯一不起作用的东西:D

知道什么是错的吗?这是Weld的错误吗?

1 个答案:

答案 0 :(得分:1)

目前,所有CDI提供程序都使用代理(规范不要求,但这就是所有三个impl的完成方式),用于注入任何非伪范围对象。如果Outer是@DependantScoped,我很确定它会按你想要的方式工作。创建的代理自然是类的子类,因此在注入的对象上调用私有方法是行不通的。老实说,我很惊讶它不会爆炸。