2010-11-15 9 views
5

मैं अपने ऐप में लोड टाइम बुनाई के साथ स्प्रिंग फ्रेमवर्क (2.5.4) का उपयोग कर रहा हूं और सबकुछ ठीक से काम करता है (स्प्रिंग बीन्स में, गैर स्प्रिंग इकाइयों में), सिवाय इसके कि जब मैं क्षेत्र में ऑटोवायर करने की कोशिश करता हूं एक सर्वलेट @Configurable के रूप में उसकी व्याख्या, तो मैं एक अच्छा NullPointerException मिलता है ...स्प्रिंग @ सर्वलेट में Servlet


@Configurable(dependencyCheck=true) 
public class CaptchaServlet extends HttpServlet{ 
    @Autowired 
    private CaptchaServiceIface captchaService; 

    @Override 
    public void init(ServletConfig config) throws ServletException { 
     super.init(config); 
    // ApplicationContext ctx = WebApplicationContextUtils.getRequiredWebApplicationContext(config.getServletContext()); 
    // captchaService = (CaptchaServiceIface) ctx.getBean("captchaService"); 
    } 

    @Override 
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
     Captcha c = captchaService.getCatpcha(); 
     req.getSession().setAttribute("captchaAnswer", c.getAnswer()); 
     resp.setContentType("image/png"); 
     ImageIO.write(c.getImage(), "png", resp.getOutputStream()); 
    } 
} 

<context:load-time-weaver/> 
<context:spring-configured/> 
<context:component-scan base-package="cz.flexibla2" /> 

मैं गलत तरीके से क्या कर रहा हूँ के बारे में कोई सुझाव?

धन्यवाद।

+1

मुझे यकीन नहीं है लेकिन यह हो सकता है कि सर्वलेट वर्ग सर्वलेट कंटेनर द्वारा लोड किया गया हो, न कि वसंत कंटेनर। –

+2

@ abhin4v: लोड-टाइम बुनाई के पीछे विचार स्प्रिंग द्वारा न केवल कक्षा को लोड करने की अनुमति देना है। – skaffman

+0

@malejpavouk, इस तरह के व्यवहार के लिए अंतिम समाधान क्या है, क्या आप इसे साझा कर सकते हैं? –

उत्तर

3

mailing list discussion और https: // bugs.eclipse.org/bugs/show_bug.cgi?id=317874 पर बग रिपोर्ट भी देखें। मैं मानता हूं कि सर्वव्यापी @Configurable सर्वलेट पर एनोटेशन वसंत ढांचे को इंगित करने के लिए पर्याप्त होना चाहिए कि तत्काल जब सर्वलेट वसंत द्वारा कॉन्फ़िगर किया जाएगा, <context:spring-configured/> का उपयोग करते समय। मैंने यह भी देखा है कि वसंत-उपकरण * .jar या spring-agent.jar के बजाय -javaagent: /path/to/aspectjweaver.jar का उपयोग करते समय वांछित व्यवहार प्राप्त किया जा सकता है। कृपया स्प्रिंग जिरा के साथ https: // jira.springframework.org/browse/SPR पर कोई समस्या उठाएं। मेरा मानना ​​है कि समस्या यह हो सकती है कि सर्वलेट क्लास - सर्वलेट का उदाहरण नहीं है, लेकिन कक्षा स्वयं - वसंत ContextLoaderListener कहलाता है इससे पहले लोड किया जाता है, इस प्रकार वसंत ढांचे के पास सर्वलेट वर्ग को उपकरण से पहले उपकरण का उपयोग करने का मौका नहीं है लदा हुआ।

भार-समय-बुनाई के लिए वसंत उपकरण लोड होने से पहले कक्षा बाइटकोड को बदलने में सक्षम होने पर आधारित होता है। यदि सर्वलेट कंटेनर क्लास ऑब्जेक्ट के एक उदाहरण पर पकड़ रहा है जिसे वसंत द्वारा परिवर्तित करने से पहले प्राप्त किया गया था, तो यह (सर्वलेट कंटेनर) रूपांतरित वर्ग के उदाहरण उत्पन्न करने में सक्षम नहीं होगा, न ही वसंत उपकरण उदाहरणों में सक्षम होगा उस वर्ग वस्तु पर कारखाने के तरीकों का उपयोग करके बनाया गया।

+0

https://jira.springsource.org/browse/SPR-7801 – malejpavouk

6

इसका कारण यह है सर्वलेट instantiated जा रहा है और सर्वलेट कंटेनर से प्रारंभ होने की संभावना है, से पहले वसंत संदर्भ प्रारंभ किया जा रहा है, और यह वसंत संदर्भ में जो लोड समय बुनाई संभालती है।

क्या आपकी <context:load-time-weaver/> सबलेट स्प्रिंग संदर्भ/या वेबैप-स्तर पर सामग्री को संभालने वाली सामग्री है? पूर्व लगभग निश्चित रूप से काम नहीं करेगा (उपर्युक्त कारणों के लिए), लेकिन एक वेबैप-स्तरीय कॉन्फ़िगरेशन काम कर सकता है (ContextLoaderListener का उपयोग करके)।

+0

मैं web.xml में contextLoaderLister का उपयोग कर रहा हूं ... और ऐसा लगता है कि कुछ बीन्स, जो सफलतापूर्वक इंजेक्शन किए गए हैं servlet से पहले बनाए गए हैं ... – malejpavouk

+0

संदर्भ: लोड-टाइम-वीवर टैग स्वयं वसंत कॉन्फ़िगरेशन फ़ाइल में है .. पता नहीं है कि यह महत्वपूर्ण है, लेकिन मैं वसंत-एजेंट का उपयोग कर रहा हूं ताकि मेरे कोड – malejpavouk

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