Guice: لا تحصل فصول AOP على التعليقات التوضيحية للفئة الفائقة

تم إنشاؤها على ٧ يوليو ٢٠١٤  ·  17تعليقات  ·  مصدر: google/guice

_From anthony.muller في 30 مايو 2008 05: 41: 03_

@ ME:
أنا مندهش تمامًا ... لقد ذكرت طريقة @ MyAnnotation ، من أجل
اعتراض المكالمات من هذه الطريقة. مشكلتي هي عندما أقوم بتحريض كائن
الذي يحتوي على مثل هذا التعليق التوضيحي باستخدام guice. عندما أبحث في الطريقة المشروحة
من خلال التفكير ، وأنا أدعو isAnnotationPresent (MyAnnotation.class) ،
هذه الطريقة ترجع خطأ!

@ jesse @ swank.ca: تحت الغطاء ، يُنشئ Guice فئة فرعية من TotoImpl
من أجل أداء طريقة الاعتراض.

بالنسبة للجزء الأكبر ، هذا شفاف تمامًا لـ
المطور ، ولكن هناك بعض العواقب. getClass ()
لا يُرجع TotoImpl.class. هذا يقيد كيف الخاص بك
يجب تنفيذ طريقة يساوي ().

أتوقع أيضًا أن Serializable لن تتفاعل معه
طريقة اعتراض.

الحل في هذه الحالة هو استخدام TotoImpl.class
بدلاً من toto.getClass () للتأمل في
نوع.

_القضية الأصلية: http://code.google.com/p/google-guice/issues/detail؟id=201_

Component-AOP Priority-Medium bug imported

التعليق الأكثر فائدة

نعم ، لقد صدمت قليلاً أيضًا لأن هذا استمر لمدة 6 سنوات حتى الآن ... أحاول إضافة AOP لاعتراض الطرق في خدمة Dropwizard وهذا يقتل هذه الفكرة تمامًا.

ال 17 كومينتر

_From anthony.muller في 30 مايو 2008 02: 41: 16_

دليل الحزمة

استيراد ثابت com.google.inject.matcher.Matchers.annotatedWith ؛
استيراد com.google.inject.matcher.Matchers.any ثابت ؛

استيراد java.lang.annotation.ElementType ؛
استيراد java.lang.annotation.Retention ؛
استيراد java.lang.annotation.RetentionPolicy ؛
استيراد java.lang.annotation.Target ؛
طريقة الاستيراد java.lang.reflect.Method ؛

استيراد org.aopalliance.intercept.MethodInterceptor ؛
استيراد org.aopalliance.intercept.Method Invitation ؛

استيراد com.google.inject.AbstractModule ؛
استيراد com.google.inject.Guice ؛
استيراد com.google.inject.ImplementedBy ؛
استيراد com.google.inject.Inject ؛
استيراد com.google.inject.Injector ؛

التعليق التوضيحي للفئة العامة

@ Target (ElementType.METHOD)
@ الاحتفاظ (RetentionPolicy.RUNTIME)
@ واجهة MyAnno {

}

@ التنفيذ بواسطة (TotoImpl.class)
واجهة توتو {
سلسلة getBidule () ،

باطل setBidule (String bidule) ؛
}

فئة TotoImpl تنفذ Toto {

بيدول سلسلة خاصة ؛

@ حقن
TotoImpl العام () {}

سلسلة getBidule العامة () {
عودة العطاء
}

@ MyAnno
setBidule العامة باطلة (سلسلة ثنائية) {
this.bidule = مزايدة ؛
}
}

فئة ثابتة MyInterceptor تنفذ MethodInterceptor {

استدعاء الكائن العام (MethodInvocation mi) يلقي بالرمي {
إرجاع mi.proceed () ؛
}

}

الفئة الثابتة MyModule تمتد إلى AbstractModule {
تكوين الفراغ العام () {
// التعليق أو إلغاء التعليق على هذا السطر لمعرفة المشكلة:
// عندما يكون هذا الربط uncomment ، فإن الطريقة الرئيسية التالية
// سيطبع "خطأ" وإلا "صحيح"
bindInterceptor (أي () ، مشروح مع (MyAnno.class) ، جديد
MyInterceptor ()) ،
}
}

رمى العام (String [] args) الرئيسي العام باطل {
حاقن حاقن = Guice.createInjector (جديد MyModule ()) ؛
Toto toto = injectionor.getInstance (Toto.class) ؛
أسلوب setter = toto.getClass (). getMethod ("setBidule"،
فئة جديدة [] {String.class}) ؛
قيمة منطقية isPresent = setter.isAnnotationPresent (MyAnno.class) ؛
System.out.println ("الحاضر:" + isPresent) ؛
}
}

_ From limpbizkit في 03 يونيو 2008 2:49:41 _

أرغب في معرفة المزيد - هل هناك حالة استخدام أو أداة أو مكتبة معينة تتطلب ذلك؟

الملخص: لا تحصل فصول AOP على التعليقات التوضيحية للفئة العليا

_ من robbie.vanbrabant في 03 يونيو 2008 10:13:19

كما أشرت في القائمة البريدية ، هناك حل بديل:

يمكنك استخدام تعليق توضيحي @ ممكّن موروث على مستوى الفصل ، والتسلل إلى
فئة في مثل هذا:

@ الاحتفاظ (RUNTIME)
الهدف @ (TYPE)
@ موروث
واجهة @ TheType {
فئة <؟> value () ؛
}

@ TheType (TotoImpl.class)
فئة ثابتة TotoImpl تنفذ Toto {
...
}

أسلوب واضع =
toto.getClass (). getAnnotation (TheType.class) .value ()
.getMethod ("setBidule"، فئة جديدة [] {String.class})؛
قيمة منطقية isPresent = setter.isAnnotationPresent (MyAnno.class) ؛
System.out.println ("الحاضر:" + isPresent) ؛

أشعر بالفضول أيضًا لمعرفة ما هي حالة الاستخدام.

_From anthony.muller في 3 يونيو 2008 12: 26: 08_

حالة الاستخدام الخاصة بي بسيطة للغاية ، وأضيف بعض التعليقات التوضيحية في فصول عملي مثل
@ الملكية ، @ GenerateEvent ، @ الأطفال ، @ الوالد ، ... هذا يسمح بإضافة المزيد
لتسهيل الاستخدام ، لإجراء بعض الاختبارات لطباعة التقارير حول
هيكل نموذج الكائن ...

_ From limpbizkit في 03 يونيو 2008

كريس - أنا جاهل تمامًا بواجهة برمجة تطبيقات cglib ، لذا سأطلب منك. هل سيتطلب إصلاح هذا الكثير من التعليمات البرمجية؟

نسخة إلى: chris.nokleberg

_من chris.nokleberg في 03 يونيو 2008 17:49:45

قد يتطلب الأمر رمزًا لنسخ التعليقات التوضيحية من الطبقة الفائقة إلى الفئة الفرعية. ذلك
سيكون جهدًا كبيرًا ، ويجب أن يكون اختياريًا لأنه ليس كذلك
متوافق مع الإصدارات السابقة ، مما يعني أنه يجب نشر الخيار في ملف
واجهة برمجة تطبيقات Guice بطريقة ما ، والتي ستكون قبيحة. عادة ما يكون من الأسهل تعديل ملف
كود التطبيق للبحث عن "مستوى واحد لأعلى" عند التعامل مع الوكيل. من المحتمل ان تكون
مفيد إذا كان لدى Guice طريقة ثابتة يمكن أن تخبرك ما إذا كان الكائن من وكيل
أو ربما يعيدك إلى الفصل غير الموكل بغض النظر.

_ من limpbizkit في 08 يونيو 2008 16:28:43 _

انظر أيضا العدد 101.

_ من الزجاجة في 29 يونيو 2008 07:18:33

عند الدمج في الأطر الحالية ، يكون التوريث التوضيحي على الفئة الفرعية
مفيد جدا. على سبيل المثال ، يستخدم إطار عمل التطبيق البديل @ الإجراء على الطرق
التي يمكنك ربطها بـ JButton. لجعلها تعمل مع Guice ، عليك أن تفعل ذلك صراحة
تمر في الفصل الذي يحتوي على الإجراءات ، بدلاً من "هذا" كما يقترح كريس.
يعمل هذا ، ولكنه يشير أيضًا إلى أنه لا يمكنك فقط تمكين بعض جوانب AOP بدون
المخاطرة بكسر الكود الحالي.

_ من gili.tzabari في 24 نوفمبر 2008 08:19: 07_

لدى FYI ، Jersey خطاف جديد يسمح لي بتمريره إلى الفصل غير المحترف ، بعد ذلك
يفحص هذا الفصل للتعليقات التوضيحية الخاصة بجزيرة جيرسي.

_ من Pavel.jbanov في 24 نوفمبر 2008 09: 28: 00 _

في حالة الاستخدام الخاصة بي ، واجهت مشكلة في طريقة عمل Struts2 @ SkipValidation
التعليق التوضيحي عندما استخدمت معترضات أخرى ... في ذلك الوقت كنت مقتنعًا بذلك
@ لم يتم تعيين SkipValidation على طريقة فئة الوكيل. http://struts.apache.org/2.x/struts2-core/apidocs/org/apache/struts2/interceptor/validation/SkipValidation.html

_ من roger.gonzalez في 16 سبتمبر 2009 18:31:19

أفترض أن هذه المشكلة تعني أيضًا أن التعليقات التوضيحية للمعلمات لا يتم نسخها إلى الوكيل؟

حاولت اعتراض بعض طرق الخدمة التي تستخدم التعليقات التوضيحية لتحديد المعلمة
أسماء عملاء JSON-RPC ، ولكن التعليقات التوضيحية المطلوبة اختفت. يبحث
المستوى "لا يبدو خيارًا قابلاً للتطبيق في هذه الحالة.

_ من joshgr في 21 أغسطس 2010 17:44:43 _

لقد شعرت بالإحباط الشديد بسبب هذا القصور بنفسي: فريقي يستخدم JPA / Hibernate مع Guice. لتسهيل "نموذج المجال الغني" (على سبيل المثال ، منطق المجال مباشرة في فئات الكيانات الخاصة بنا) ، أستخدم Hibernate Interceptor لزيادة مثيل Hibernate للكيان ، وإنشاء مثيلات الكيان باستخدام Guice Injector. يتيح ذلك لـ Guice AOP والحقن في حالات الكيان الخاصة بنا: يمكننا إضافة تعليقات توضيحية إلى طرق النموذج باستخدام @ Transactional (a-la warp-persist) ، ويمكننا @ إدخال التبعيات في كياناتنا مباشرة. حلو!

يعمل هذا بشكل جميل ، باستثناء أنه لم يتم الاحتفاظ بالتعليقات التوضيحية لأسلوب JPA القياسي لمراقبي أحداث دورة الحياة ( @ PrePersist ، @ PreUpdate ، إلخ) في مثيلات الكيان المحسن Guice. مفاجأة! تسبب هذا في خطأ خفي ظهر فقط عندما أضفنا Guice MethodInterceptor إلى فئة كيان موجودة ... فجأة ، توقف استدعاء عمليات رد نداء دورة حياة الكيان! شكرا لله على اختبارات التكامل.

أقوم حاليًا بإنشاء حل بديل يتضمن EntityListener على مستوى الفصل الدراسي والذي سيبحث عن الشجرة للعثور على التعليقات التوضيحية لحدث المثابرة واستدعاءها ، ولكن هذا مرهق للغاية ، والأهم من ذلك ، أنه لا يجب أن يكون مصدر قلق لي : يقوم Guice ببناء الأشياء الخاصة بي وتقديم AOP "السحري" ، لكن التجريد يتسرب هنا.

إذا كان تنفيذ طريقة-التعليق التوضيحي-الاحتفاظ افتراضيًا مكلفًا للغاية ، فيبدو من المناسب أن يدعمها إطار العمل على الأقل عند الطلب ، كتكوين ملزم ..؟

لا تزال الأدوات والوظائف القائمة على التعليقات التوضيحية أكثر انتشارًا ؛ أتوقع أن تأثير هذا الفشل الدقيق قد يصبح أكثر شيوعًا ومكلفًا للمطورين المحسنين. الإصلاح بلز.

_ من [email protected] في 16 تموز (يوليو) 2012 11:13: 27_

(لم يتم إدخال أي تعليق لهذا التغيير.)

الحالة: تم الإقرار
التسميات: مكون- AOP

_ من leitao.otavio في 16 فبراير 2014 09:50:33

أواجه نفس المشكلة التي وصفها جوشغر وهي محبطة حقًا. أقوم فقط بإضافة شرح توضيحي للطريقة ويوقف Guice "التعامل" مع بعض التعليقات التوضيحية (الأخرى) إلى كائن الوكيل. من فضلك أصلحه!

نعم ، لقد صدمت قليلاً أيضًا لأن هذا استمر لمدة 6 سنوات حتى الآن ... أحاول إضافة AOP لاعتراض الطرق في خدمة Dropwizard وهذا يقتل هذه الفكرة تمامًا.

أعتقد أنني أصلحت هذه المشكلة عن طريق كتابة أداة مطابقة طريقة مخصصة - يرجى الاطلاع على https://codingcraftsman.wordpress.com/2018/11/11/google-guice-aop-with-interface-annotations/ والتعليقات إذا كانت حل لك.

بناءً على حل ashleyfrieze ، إليك بعض التعليمات البرمجية التي تبحث عن الطريقة "الحقيقية". لحسن الحظ ، تمكنا في الكود الخاص بنا من استبدال الطريقة الوكيلة بالطريقة الحقيقية في السيناريو المحدد حيث فشل ذلك بالنسبة لنا:

private Method findRealMethod(Method proxiedMethod) {
    try {
        return proxiedMethod.getDeclaringClass().getSuperclass().getMethod(proxiedMethod.getName(), proxiedMethod.getParameterTypes());
    } catch (NoSuchMethodException e) {
        return proxiedMethod;
    }
}
هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

prasanthgithub picture prasanthgithub  ·  14تعليقات

riuvshin picture riuvshin  ·  14تعليقات

ronshapiro picture ronshapiro  ·  12تعليقات

kamenik picture kamenik  ·  5تعليقات

gissuebot picture gissuebot  ·  3تعليقات