حدث خطأ في الوصول الخاص إلى الطبقة الخارجية المحقونة لـ CDI من الطبقة الداخلية الثابتة
-
21-12-2019 - |
سؤال
لدي (في إصدار مبسط) حبوب CDI التالية المُدارة في JBoss EAP 6.0.1
@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
يصل إلى السمة الحقيقية لمثيل الحبة المُدارة الحقيقية.
ولجعل الأمور أكثر إرباكًا:إذا قمت بتغيير مستوى الوصول لـ addValue
الى واحد من package
, protected
أو public
كل شيء يعمل كما هو متوقع.
لكن الغرض من الطبقة الداخلية في حالتي هو تسهيل جعل الطريقة خاصة بحيث لا يتمكن عملاء CDI الآخرين من الاتصال بهذه الطريقة.والآن هذا هو الشيء الوحيد الذي لا يعمل :D
أي فكرة ما هو الخطأ؟هل هذا خطأ في ولد؟
المحلول
يستخدم جميع موفري CDI حاليًا الوكلاء (ليس هذا مطلوبًا بموجب المواصفات، ولكن هذه هي الطريقة التي تم بها تنفيذ جميع الضمنات الثلاثة) لحقن أي كائنات غير ذات نطاق زائف.لو كان الخارجي @DependantScoped
أنا متأكد من أنها ستعمل بالطريقة التي تريدها.الوكلاء الذين تم إنشاؤهم هم بطبيعة الحال فئات فرعية من فئاتك، لذا فإن استدعاء أسلوب خاص على كائن محقون لن ينجح.بصراحة أنا مندهش أنه لا ينفجر.