حدث خطأ في الوصول الخاص إلى الطبقة الخارجية المحقونة لـ CDI من الطبقة الداخلية الثابتة

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

  •  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 أنا متأكد من أنها ستعمل بالطريقة التي تريدها.الوكلاء الذين تم إنشاؤهم هم بطبيعة الحال فئات فرعية من فئاتك، لذا فإن استدعاء أسلوب خاص على كائن محقون لن ينجح.بصراحة أنا مندهش أنه لا ينفجر.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top