静的内側クラスからのCDI注入外部クラスのプライベートアクセスエラー
-
21-12-2019 - |
質問
私は(最小限のバージョンで)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
の呼び出しによって生成されたOuter
属性のバージョンにアクセスし、public void printValues
への呼び出しは実際の管理対象Beanインスタンスの実属性にアクセスします。
物事をさらに混乱させるために:addValue
のアクセスレベルをpackage
、protected
、またはpublic
のいずれかに変更すると、すべてが期待どおりに機能します。
しかし私の場合の内部クラスの目的は、外部の他のCDIクライアントがその方法を呼び出すことができないように、その方法をプライベートにすることを容易にすることでした。そして今ではうまくいかない唯一のもの:d
何らかの考え方何が悪いの?これは溶接のバグですか?
解決
現在すべてのCDIプロバイダを使用するプロキシを使用します(仕様には必要ありませんが、それが3つのインプルのすべてが行われていますが、疑似スコープ以外のオブジェクトが注入されているかです)。外側が@DependantScoped
であった場合、私はそれがあなたがそれを望む方法でうまくいくでしょう。作成されたプロキシは、クラスの自然にサブクラスであるため、注入されたオブジェクトにプライベートメソッドを呼び出すことは機能しません。正直なところ、それは爆発しない驚きました。
所属していません StackOverflow