2010-10-29 13 views
14

मेरा जावा ईई 6 एप्लिकेशन कान युद्ध में पैक किया गया एक युद्ध और एक ईजेबी मॉड्यूल शामिल है। मैं DI के लिए सीडीआई का उपयोग कर रहा हूं (यानी मेरे पास दोनों मॉड्यूल में beans.xml फ़ाइल है)। मैं एक लॉगिंग इंटरसेप्टर का उपयोग करना चाहता हूं जिसे युद्ध मॉड्यूल में ईजेबी मॉड्यूल में भी परिभाषित किया गया है। मैं EJB के beans.xml में इंटरसेप्टर सक्रिय कर दिया है:सीडीआई: विभिन्न मॉड्यूल/बीन अभिलेखागारों में इंटरसेप्टर्स का उपयोग

<beans> 
    <interceptors> 
     <class>com.test.interceptor.LoggingInterceptor</class> 
    </interceptors> 
</beans> 

यह कक्षाएं कि EJB मॉड्यूल में इंटरसेप्टर से एनोटेट के लिए ही काम कर रहा है। युद्ध मॉड्यूल में कक्षाओं को अवरुद्ध नहीं किया जाता है (हालांकि वे भी इंटरसेप्टर के साथ एनोटेटेड हैं)। मैंने सोचा कि समाधान युद्ध के इंटरसेप्टर में इंटरसेप्टर को सक्षम करना होगा, साथ ही (ऊपर की तरह)।

गंभीर:: लेकिन आवेदन निम्न संदेश के साथ तैनात नहीं किया जा सकता अपवाद जबकि एप्लिकेशन को लोड करने: वेल्ड-001,417 सक्षम इंटरसेप्टर वर्ग वर्ग com.test.interceptor.LoggingInterceptor न टिप्पणी की जाती है और न ही @Interceptor एक पोर्टेबल विस्तार के माध्यम से पंजीकृत

मेरे LoggingInterceptor इस तरह दिखता है:

@Log 
@Interceptor 
public class LoggingInterceptor { 
    private static final Logger logger = Logger.getLogger(LoggingInterceptor.class.getName()); 

    static { 
     logger.setLevel(Level.ALL); 
    } 

    @AroundInvoke 
    public Object logMethod(InvocationContext ctx) throws Exception { 
     logger.log(Level.FINE, "ENTRY {0} {1}", 
       new Object[]{ ctx.getTarget().getClass().getName(), ctx.getMethod().getName() }); 
     long startTime = System.nanoTime(); 
     try { 
      return ctx.proceed(); 
     } finally { 
      long diffTime = System.nanoTime() - startTime; 
      logger.log(Level.FINE, "RETURN {0} {1}", 
       new Object[]{ ctx.getTarget().getClass().getName(), ctx.getMethod().getName() }); 
      logger.log(Level.FINE, "{0} took {1} ms", new Object[]{ ctx.getMethod(), 
        TimeUnit.MILLISECONDS.convert(diffTime, TimeUnit.NANOSECONDS)}); 
     } 
    } 

} 

और इंटरसेप्टर बाध्यकारी:

@InterceptorBinding 
@Retention(RetentionPolicy.RUNTIME) 
@Target({ElementType.METHOD, ElementType.TYPE}) 
public @interface Log {} 

मैं दोनों मॉड्यूल के लिए इंटरसेप्टर का उपयोग कैसे कर सकता हूं?

+0

क्या आपको इस समस्या का समाधान मिला है? यह देखना दिलचस्प होगा। – mik

+1

@ मिल्क नंबर, मैंने नहीं किया है। मैंने एक मॉड्यूल मॉड्यूल में सभी मॉड्यूल को समेकित किया, जो जावा ईई 6. – Theo

+0

वाह के बाद से संभव है, इसे स्पष्ट रूप से बाहर रखने के लिए धन्यवाद। मुझे एक ही समस्या थी और इसे एक मॉड्यूल में हल करने के लिए इसे हल किया गया था। कभी-कभी जे 2 ईई बस चीजों को कड़ी मेहनत करने की कोशिश करता है ... – JoshC13

उत्तर

1

मुझे आश्चर्य है कि क्या आपके युद्ध में आपके ईजेबी-जार में क्लासलोडर चिपचिपापन की कमी है? मुझे लगता है कि आदर्श रूप से 2 9 9 इंटरसेप्टर अपने स्वयं के जार में होंगे, जो ईजेबी और वेब मॉड्यूल दोनों के लिए दृश्यमान होंगे और उनके दोनों beans.xml में सक्षम होंगे।

5

बहुत देर हो चुकी है, लेकिन अगर किसी को अभी भी यह समस्या है। कम से कम वेबस्पेयर 8b2 में, विभिन्न मॉड्यूल में इंटरसेप्टर का उपयोग करने के लिए दोनों मॉड्यूल को एक ही क्लासलोडर द्वारा लोड किया जाना चाहिए। वेबस्पेयर में यह सेटिंग प्रशासन कंसोल में स्विच की जा सकती है: एप्लीकेशन> एप्लिकेशन प्रकार> वेबस्पेयर एंटरप्राइज़ एप्लिकेशन> [आपका ऐप नाम]> क्लास लोडिंग और अपडेट डिटेक्शन> WAR क्लास लोडर पॉलिसी = एप्लिकेशन के लिए सिंगल क्लास लोडर।
इंटरसेप्टर केवल beans.xml में केवल एक बार सक्षम होना चाहिए।

+0

सही उत्तर के लिए यह कभी देर नहीं होता है, thx :-) –

+2

यदि वेबस्पेयर में इसकी अनुमति है (और आम), तो यह जेईई आवेदन के लिए अनुशंसित नहीं है। कक्षा लोडर एक कारण के लिए अलग हैं। –

0

मेरे पास जेबॉस एएस 6.0/6.1 (रात का निर्माण) पर एक ही समस्या है और इसे disabling separate classloaders (विकल्प 1) द्वारा तय किया गया है, लेकिन इसके साथ बेहद सावधान रहें। classloaders की जुदाई बिना किसी कारण के पेश नहीं किया गया है, तो जाहिरा तौर पर वहाँ आगे सड़क पर नई समस्याएं हैं ...

This jira रिपोर्ट है तो यह वोट अप :-)

8

J2EE 7 विनिर्देश कृपया कहते हैं (reference):

इंटरसेप्टर कि आप beans.xml फ़ाइल में निर्दिष्ट एक ही संग्रह में वर्गों के लिए ही लागू होते हैं। जो एक से अधिक होते हैं मॉड्यूल

यह समाधान विक्रेता स्वतंत्र होने का लाभ है एक आवेदन के लिए विश्व स्तर पर इंटरसेप्टर निर्दिष्ट करने के लिए @Priority एनोटेशन का प्रयोग करें।

एक उदाहरण:

@Logged 
@Interceptor 
@Priority(Interceptor.Priority.APPLICATION) 
public class LoggedInterceptor implements Serializable { ... } 
+0

मैं WildFly 10.1.0.Final पर इस काम की पुष्टि कर सकता हूं – schnatterer

0

मैं JBoss 7 पर मेरी logging interceptor साथ बिल्कुल वैसा ही समस्या थी और द्वारा यह तय आवेदन में पूरा इंटरसेप्टर के जार डालने।

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-war-plugin</artifactId> 
      <version>2.4</version> 
      <configuration> 
       <overlays> 
        <overlay> 
         <groupId>com.github.t1</groupId> 
         <artifactId>logging-interceptor</artifactId> 
         <type>jar</type> 
         <targetPath>WEB-INF/classes</targetPath> 
        </overlay> 
       </overlays> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 

<dependencies> 
    <dependency> 
     <groupId>com.github.t1</groupId> 
     <artifactId>logging-interceptor</artifactId> 
     <version>1.1</version> 
     <optional>true</optional> 
    </dependency> 
</dependencies> 

आप अभी भी एप्लिकेशन के breans.xml में इंटरसेप्टर सक्रिय करने के लिए होगा।

अच्छा नहीं है, लेकिन यह काम करता है। जावा ईई 7 में, यह इंटरसेप्टर को @Priority के रूप में एनोटेट करके सक्रियण के बिना काम करता है।

संबंधित मुद्दे