2011-01-16 16 views
6

मैं वसंत-एमवीसी एप्लिकेशन में अपने कस्टम टैगलिब्स में वसंत-बीन्स का उपयोग करना चाहता हूं। क्योंकि टैगलिब-इंस्टेंस वसंत द्वारा तत्काल नहीं होते हैं, मैं निर्भरता-इंजेक्शन का उपयोग नहीं कर सकता।स्प्रिंग एमवीसी और कस्टम टैग

मेरा अगला विचार वसंत-संदर्भ को अनुरोध के लिए एक इंटरसेप्टर द्वारा जोड़ना था और इसे टैग-क्लास के भीतर अनुरोध से प्राप्त करना था।

टैगलिब्स में वसंत का उपयोग करने का कोई बेहतर तरीका है? वसंत में कुछ उपयोग करने के लिए उपयोग है? यदि वसंत-एमवीसी में पहले से ही कस्टमटैग-समर्थन नहीं है, तो निर्भरता के साथ एक एक्सिसिटिंग ऑब्जेक्ट को पॉप्युलेट करने का कोई तरीका है?

public class MyTag extends TagSupport { 
    @Autowired 
    private MyObject object; 

    public void setMyObject(MyObject myObject) { 
    this.myObject = myObject; 
    } 

    public int doEndTag() { 
    ApplicationContext context = request.getAttribute("context"); 
    context.populate(this); 

    return object.doStuff(); 
    } 
} 
+0

के संभावित डुप्लिकेट [कैसे एक JSP 2.0 SimpleTag में वसंत सेम सुई?] (Http://stackoverflow.com/questions/1296052/how-to-inject-spring-beans-into- ए-जेएसपी -2-0-सरलटाग) – skaffman

+0

मुझे पता है कि शायद आप इसे सुनना नहीं चाहते हैं, लेकिन आप ऐसे परिचालन क्यों कर रहे हैं जिनके लिए वसंत सेम की आवश्यकता है? अपने विचारों को यथासंभव सरल रखने के लिए सबसे अच्छा अभ्यास है। यदि आप पहले से नहीं हैं तो मैं कोशिश करूँगा और अपने नियंत्रक में ऐसा करने का प्रयास करूंगा ... – Caps

+0

मैं @ कैप्स से सहमत हूं। आपको उस कोड को नियंत्रक को ले जाना चाहिए। –

उत्तर

3

अंत में काम कर रहे रास्ते पर मेरी समाधान की जाँच इस घोषणा करने के लिए था करने के लिए फ़ील्ड जिन्हें वसंत द्वारा स्थिर के रूप में शुरू किया जाना चाहिए और एक टैग-इंस्टेंस

शुरू करना चाहिए
public class MyTag extends TagSupport { 
    private static MyObject myObject; 

    @Autowired 
    public void setMyObject(MyObject myObject) { 
    MyTag.myObject = myObject; 
    } 

    public int doEndTag() { 
    return object.doStuff(); 
    } 

}

2

आपको उस तर्क को अपने नियंत्रक में रखना पसंद करना चाहिए। यदि आपको वास्तव में ऐसा करने की आवश्यकता है तो आप आवेदन संदर्भ से सेम को पुनर्प्राप्त करने के लिए उपयोगिता वर्ग लिख सकते हैं।

public class AppContextUtil implements ApplicationContextAware 
{ 
    private static final AppContextUtil instance = new AppContextUtil(); 
    private ApplicationContext applicationContext; 

    private AppContextUtil() {} 

    public static AppContextUtil getInstance() 
    { 
     return instance; 
    } 

    public <T> T getBean(Class<T> clazz) 
    { 
     return applicationContext.getBean(clazz); 
    } 

    @Override 
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException 
    { 
     this.applicationContext = applicationContext; 
    } 
} 

फिर आप इस तरह अपने सेम को पुनः प्राप्त करने में सक्षम हो जाएगा:

AppContextUtil.getInstance().getBean(MyObject.class); 
0

अपने नियंत्रक में, मॉडल में वस्तु डाल दिया।

ऑब्जेक्ट अब HttpRequest ऑब्जेक्ट में पाया जा सकता है जो आपके टैग का हिस्सा है।

नियंत्रक:

model.addAttribute("item", item); 

JSP फ़ाइल:

<%= ((com.content.CmsItem)(request.getAttribute("item"))).getId() %> 

आप autowire करना आवश्यक है, 'is there an elegant way to inject a spring managed bean into a java custom/simple tag'

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