静的内側クラスからのCDI注入外部クラスのプライベートアクセスエラー

StackOverflow https://stackoverflow.com//questions/21029071

  •  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のアクセスレベルをpackageprotected、またはpublicのいずれかに変更すると、すべてが期待どおりに機能します。

しかし私の場合の内部クラスの目的は、外部の他のCDIクライアントがその方法を呼び出すことができないように、その方法をプライベートにすることを容易にすることでした。そして今ではうまくいかない唯一のもの:d

何らかの考え方何が悪いの?これは溶接のバグですか?

役に立ちましたか?

解決

現在すべてのCDIプロバイダを使用するプロキシを使用します(仕様には必要ありませんが、それが3つのインプルのすべてが行われていますが、疑似スコープ以外のオブジェクトが注入されているかです)。外側が@DependantScopedであった場合、私はそれがあなたがそれを望む方法でうまくいくでしょう。作成されたプロキシは、クラスの自然にサブクラスであるため、注入されたオブジェクトにプライベートメソッドを呼び出すことは機能しません。正直なところ、それは爆発しない驚きました。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top