作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 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
一切都按预期进行。
但在我的例子中,内部类的目的是使该方法成为私有(private)的,以便 Outer 的其他 CDI 客户端无法调用该方法。现在这是唯一不起作用的事情:D
知道出了什么问题吗?这是 Weld 中的错误吗?
最佳答案
目前,所有 CDI 提供程序都使用代理(规范中不要求这样做,但这就是所有三个 impl 的完成方式)来注入(inject)任何非伪作用域对象。如果 Outer 是 @DependantScoped
我很确定它会按照您想要的方式工作。创建的代理自然是类的子类,因此在注入(inject)的对象上调用私有(private)方法是行不通的。老实说,我很惊讶它没有爆炸。
关于java - 从静态内部类私有(private)访问 CDI 注入(inject)外部类时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21029071/
我是一名优秀的程序员,十分优秀!