سؤال

لدي تطبيق JEE5 يعرض الخدمات باستخدام وحدات الجلسة (المحلية).

عند حدوث خطأ داخلي أثناء تنفيذ الخدمة، يتم طرح RuntimeException وتغليفه بواسطة JBoss(5.0.1) في javax.ejb.EJBTransactionRolledbackException.

تكمن المشكلة في أن تطبيقات العميل التي تتلقى EJBTransactionRolledbackException يمكنها الوصول إلى معلومات تفصيلية حول سبب استثناء وقت التشغيل، مما يكشف البنية الداخلية لتطبيقي.وأنا لا أريد ذلك.

بدلاً من ذلك، أود أن يقوم JBoss دائمًا بتغليف RuntimeException الذي تم طرحه بواسطة وحدات الجلسة المكشوفة في استثناء فني واحد (وبسيط) (بدون سبب).

ما هي أفضل طريقة لتحقيق ذلك؟(باستخدام اعتراضات؟باستخدام تكوين JBoss؟)

هل كانت مفيدة؟

المحلول

وأخيرا، استنادا إلى الإجابة السابقة وأبحاثي الشخصية، احتفظت بالحل التالي.

لقد قمت بإنشاء أداة اعتراضية مخصصة لإدارة أخطاء الخادم:

public class FaultBarrierInterceptor {

@AroundInvoke
public Object intercept(final InvocationContext invocationContext) throws Exception {
    try {
        return invocationContext.proceed();
    } catch (final RuntimeException e) {
        final Logger logger = Logger.getLogger(invocationContext.getMethod().getDeclaringClass());
        logger.error("A fault occured during service invocation:" +
                "\n-METHOD: " + invocationContext.getMethod() +
                "\n-PARAMS: " + Arrays.toString(invocationContext.getParameters()), e);
        throw new TechnicalException();
    }
}}

يمتد الاستثناء الفني الذي تم طرحه إلى EJBException ولا يكشف عن سبب RuntimeException:

public class TechnicalException extends EJBException {}

أستخدم هذا المعترض في جميع الخدمات العامة:

@Stateless
@Interceptors({FaultBarrierInterceptor.class})
public class ShoppingCardServicesBean implements ShoppingCardServices { ...

وهذا تنفيذ لل نمط حاجز الخطأ.

يتم اكتشاف أي استثناء في وقت التشغيل وتسجيله وإرسال إشارة إلى وجود خطأ إلى العميل (بدون تفاصيل داخلية) باستخدام TechnicalException.يتم تجاهل الاستثناءات المحددة.

تعتبر معالجة RuntimeException مركزية ومنفصلة عن أي أساليب عمل.

نصائح أخرى

وأي RuntimeException يمتد java.lang.Exception.

ووالمواصفات EJB توفر التعامل مع 2 أنواع من الاستثناءات (تطبيق والنظام)

إذا كنت ترغب في رمي استثناء النظام، يمكن أن تفعله عادة ما مثل ذلك:

try {
.... your code ...
}catch(YourApplicationException ae) {
   throw ae;
}catch(Exception e) {
   throw new EJBException(e); //here's where you need to change.
}

لإخفاء التفاصيل الداخلية للاستثناء النظام الخاص بك، ببساطة استبدال:

throw new EJBException(e); 

ومع:

throw new EJBException(new TechnicalException("Technical Fault"));

وهذا الأمل هو ما كنت أبحث عنه.

وهتاف

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