2012-10-11 26 views
6

मैं जेबॉस 7.1 का उपयोग कर जावा ईई एप्लिकेशन बना रहा हूं।जावा ईई इंटरसेप्टर और @ViewScoped बीन

उपयोगकर्ता क्रियाओं का पूर्ण लेखा परीक्षा प्राप्त करने के लिए, मैं अपने बीन्स के तरीकों के हर आमंत्रण को लॉग इन करने के लिए इंटरसेप्टर्स का उपयोग करने की योजना बना रहा हूं।

@Logged 
@Interceptor 
public class UserActionInterceptor implements Serializable { 

private static final long serialVersionUID = 1L; 
private Logger log = LoggerFactory.getLogger(UserActionInterceptor.class); 

public UserActionInterceptor() { 
} 

@AroundInvoke 
public Object logMethodEntry(InvocationContext invocationContext) throws Exception { 
    log.debug(invocationContext.getMethod().getName() + " invoked."); 
    return invocationContext.proceed(); 
    } 
} 

अभी तक यह काम कर रहा है ठीक:

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

तब मैं अपने इंटरसेप्टर वर्ग को परिभाषित:

तो मैं निम्नलिखित नीलामी है ऐसा करने के लिए। अगर मैं इस इंटरसेप्टर का उपयोग कर कक्षा को बांधता हूं तो मुझे कुछ लॉगिंग मिलती है। हालांकि जब मैं अपने सेम कक्षाओं को लक्षित करना चाहता हूं तो यह मुश्किल हो जाता है।

यदि मेरे पास @RequestScoped प्रकार का बीन है और यह मेरे इंटरसेप्टर को बांधता है तो यह काम करता है। हालांकि, अगर मेरे पास @ViewScoped प्रकार का बीन है तो यह नहीं है।

मैं @ViewScoped की परिभाषा को देखा और मैंने पाया:

@Retention(value=RUNTIME) 
@Target(value=TYPE) 
@Inherited 
public @interface ViewScoped 

मैं लग रहा है कि समस्या तथ्य में निहित है कि यह व्याख्या लक्ष्य प्रकार विधि और यह है कि नहीं है है क्लास विधियों को कॉल को अवरुद्ध करने के लिए मेरे इंटरसेप्टर को रोकता है।

क्या किसी के पास पहले भी यही समस्या थी? क्या किसी को पता है कि बीन के दायरे को विस्तारित करना संभव है ताकि @ViewScoped की प्रकृति को बदले बिना इसकी विधियों को अवरुद्ध किया जा सके?

उत्तर

3

ऐसा इसलिए होता है क्योंकि इंटरसेप्टर @ManagedBean तक नहीं पहुंच सकता है। @ व्यूस्कोप सीडीआई का हिस्सा नहीं है और यह जेएसएफ बीन्स के साथ आता है।

इसे काम करने के लिए, यह सुनिश्चित करने का एक निश्चित तरीका है कि इसे प्रदान करने वाले एक्सटेंशन में से किसी एक का उपयोग करके @ViewScoped को CDI के साथ उपयोग करना है। आपके विकल्पों में माईफेसेस सीओडीआई और सीम 3 शामिल हैं (उदाहरण के लिए)।

मैं मिल गया है यह काम कर रहा (उसी तरह आप इसे वर्णन) इन आयात के साथ MyFaces CODI स्थापित करने और उपयोग करते हुए निम्नलिखित एनोटेशन द्वारा:

import javax.faces.bean.ViewScoped; 
import javax.inject.Named; 

@Named 
@ViewScoped 
@Interceptors({ MyInterceptor.class})