2010-08-10 17 views
11

में वसंत प्रबंधित बीन इंजेक्ट करने का एक शानदार तरीका है मेरे पास जावा कस्टम टैग का एक गुच्छा है जो वसंत प्रबंधित बीन्स का उपयोग करता है .. क्योंकि मुझे कस्टम टैग में इंजेक्ट करने का कोई तरीका नहीं मिल रहा है, मैं एक सहायक वर्ग बनाया जो मुझे आवश्यक सभी वसंत बीन वस्तुओं के लिए "getTheObjectINeedBean()" को स्थिर तरीकों प्रदान करता है .. मुझे यह दृष्टिकोण बिल्कुल पसंद नहीं है।एक जावा कस्टम/सरल टैग

मैं सच में एक स्प्रिंग कस्टम टैग

में सेम कामयाब इंजेक्षन करने में सक्षम होना चाहता हूँ वहाँ एक रास्ता है? जहाँ तक मेरी अनुसंधान चला जाता है, मैं समझता हूँ वहाँ यह करने के लिए कोई रास्ता नहीं है, क्योंकि कस्टम टैग कंटेनर में कामयाब रहे है

धन्यवाद,

बिली

+0

http://stackoverflow.com/questions/1296052/how-to-inject-spring-beans-into-a-jsp-2-0-simpletag – skaffman

उत्तर

7

आप सही कर रहे हैं वहाँ एक आसान तरीका करने के लिए नहीं है jstl टैग में निर्भरता-इंजेक्शन का उपयोग करें, क्योंकि वे वसंत द्वारा प्रबंधित नहीं होते हैं, और नहीं हो सकते हैं। AspectJ आप/लोड समय में एक बुनकर प्लग संकलन समय है, ताकि यहां तक ​​कि वस्तुओं कि वसंत से instantiated नहीं कर रहे हैं वसंत के बारे में पता किया जा सकता है की अनुमति देता है -

  • @Configurable: लेकिन वहाँ (कम से कम) दो कामकाज से जुड़े हैं। देखें here

  • आप अपनी परियोजना के लिए बेस टैग क्लास बना सकते हैं, और प्रत्येक doStartTag(..) विधि से init(..) विधि पर कॉल कर सकते हैं। वहां, आप से ServletContext प्राप्त कर सकते हैं, और इस प्रकार वसंत ApplicationContext (ApplicationContextUtils के माध्यम से) प्राप्त कर सकते हैं। तब:

    AutowireCapableBeanFactory factory = appCtx.getAutowireCapableBeanFactory(); 
    factory.autowireBean(this); 
    

न तो विकल्प सही के रूप में वे की आवश्यकता होती है या तो कुछ अतिरिक्त कोड, या कुछ "काला जादू"

7

@ Bozho की पोस्ट पर विस्तार करने के लिए, मैं इस मिल गया है तो तरह काम करने के लिए कर रहे हैं:

public class LocationTag extends RequestContextAwareTag { 
    @Autowired 
    PathComponent path; 

... 
    @Override 
    protected int doStartTagInternal() throws Exception { 
     if (path == null) { 
      log.debug("Autowiring the bean"); 
      WebApplicationContext wac = getRequestContext().getWebApplicationContext(); 
      AutowireCapableBeanFactory acbf = wac.getAutowireCapableBeanFactory(); 
      acbf.autowireBean(this); 
     } 
     return SKIP_BODY; 
    } 
} 
+0

का डुप्लिकेट धन्यवाद "getRequestContext()। GetWebApplicationContext()" हल हो गया मेरी समस्या – TrueCoke

0

समाधान के रूप में काम करता है कि ऊपर वर्णित है, लेकिन कुछ पृष्ठभूमि और अतिरिक्त कोड के टुकड़े, कर रहे हैं काफी संभावना है, उपयोगी (वसंत 3.0 में कोई ApplicationContextUtils कि मैं मिल सकता है)।

1) DoStartTagInternal विधि doStartTag विधि से लागू की जाती है। 2) मुझे doStartTag 3 का आह्वान करने से पहले पृष्ठ को कॉन्टेक्स्ट सेट करने के लिए मजबूर होना पड़ा 3) मैंने ऑटोवॉयरिंग के विरोध में बीन का एक लुकअप किया। मेरे लिए यह अधिक सरल लगता है: (YourBeanProxy) autowireCapableBeanFactory.getBean ("yourBeanName")

उम्मीद है कि यह अतिरिक्त जानकारी उपयोगी है।

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