2012-01-19 7 views
14

मैं जेएसएफ एनोटेशन और कुछ वसंत एनोटेशन का उपयोग करना चाहता हूं ताकि एक जेएसएफ प्रबंधित बीन में एक वसंत बीन/सेवा इंजेक्ट किया जा सके। (जेएसएफ बीन पर मैं केवल जेएसएफ एनोटेशन का उपयोग करना चाहता हूं) मैं @named/@inject जैसे एनोटेशन का उपयोग नहीं करना चाहता हूं।जेएसएफ 2 @ManagedProperty के साथ स्प्रिंग बीन/सेवा इंजेक्ट करें और कोई xml

मैंने नेट पर समाधान खोजने की कोशिश की है लेकिन बिना किसी किस्मत के।

उदाहरण

@ManagedBean 
@ViewScoped 
public class MyBean { 

    @ManagedProperty(value = "#{mySpringBean}") 
    private MySpringBean mySpringBean; 

    public void setMySpringBean(MySpringBean mySpringBean) { 
     this.mySpringBean = mySpringBean; 
    } 

    public void doSomething() { 
    //do something with mySpringBean 
    } 
} 

एक्सएमएल के उपयोग के बिना यह संभव तरह कुछ है। उदाहरण के लिए, मैं

FacesContextUtils.getWebApplicationContext(context).getBean("MySpringBean"); 

या faces-config.xml

<managed-bean> 
    <managed-bean-name>myBean</managed-bean-name> 
    <managed-bean-class>com.mytest.MyBean</managed-bean-class> 
    <managed-bean-scope>view</managed-bean-scope> 
    <managed-property> 
     <property-name>mySpringBean</property-name> 
     <value>#{mySpringBean}</value> 
    </managed-property> 
</managed-bean> 

एनोटेशन के साथ और सभी JSF सेम/गुण और वसंत को परिभाषित करने के बिना ऊपर संभव तरह कुछ है में की तरह कुछ का उपयोग करने के लिए नहीं चाहते हैं कॉन्फ़िगरेशन xml फ़ाइलों में हर बीन के लिए बीन्स/गुण?

+0

अजीब बात है पर एक नजर है, मैं इंजेक्शन की इस पद्धति का उपयोग करें और यह मेरे लिए काम करता है, लेकिन फिर मैं भी में संपत्ति इंजेक्शन शामिल हैं मेरी 'applicationContext.xml' भी। स्प्रिंग ईएल रिज़ॉल्वर ने देखा है कि मैंने देखा है कि ViewScoped बीन्स के साथ काम नहीं करता है। सत्र स्कोप्ड में इसे बदलने का प्रयास करें और देखें कि संपत्ति इंजेक्शन हो गई है या नहीं। –

+0

मैं applicationContext.xml से बचना चाहता हूं (मैं थोड़ा जिद्दी हूँ! धन्यवाद) लेकिन धन्यवाद :) – Dimman

उत्तर

14

मतलब MySpringBean आप पहले से ही वसंत कंटेनर क्यों अपनी @Autowired एनोटेशन का उपयोग नहीं है। इसके लिए, बोनी द्वारा सुझाए गए अनुसार अपने चेहरे-config.xml को अपडेट करें। फिर इस

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>/WEB-INF/applicationContext.xml</param-value> 
</context-param> 

<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 

<listener> 
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> 
</listener> 

के बाद अपने web.xml करने के लिए इन श्रोताओं को जोड़ने फिर अपने applicationContext.xml

<context:component-scan base-package="com.examples" /> 

अब आप स्प्रिंग व्याख्या का उपयोग कर सकते हैं करने के लिए इन जोड़ सकते हैं और अपने सेम कुछ इस तरह होगा:

package com.examples; 
@Component 
@Scope(value="request") 
public class MyBean { 
    @Autowired 
    private MySpringBeanClass mySpringBean; 
} 

@Service के साथ अपने MySpringBeanClass एनोटेट

भी देखें:

+1

और आप एक कस्टम ViewScope क्लास कि औजार लिखने की ज़रूरत आप वसंत में ViewScope उपयोग करना चाहते हैं स्कोप। उस [लिंक] के लिए इस ब्लॉग एंट्री का पालन करें (http://cagataycivici.wordpress.com/2010/02/17/port-jsf-2-0s-viewscope-to-spring-3-0/) – Ravi

11

अपने में इस कोड डाल चेहरे-config.xml

<faces-config xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd" 
    version="2.0"> 
    <application> 
     <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver> 
    </application> 
</faces-config> 
फिर अपने ManageBean निर्माता कॉल में

;

WebApplicationContext ctx = FacesContextUtils.getWebApplicationContext(FacesContext.getCurrentInstance()); 
mySpringBean = ctx.getBean(MySpringBean.class); 

अपने स्प्रिंग बीन कक्षा

+0

मैंने यह किया है लेकिन मेरा इंजेक्शन बीन हमेशा शून्य है। – Dimman

+0

क्या यह वसंत बीन में एनोटेशन के साथ किया जा सकता है और एप्लिकेशन Context.xml में इसे बिना घुसपैठ के किया जा सकता है? <सेम आईडी = "mySpringBean" class = "com.mytest.MySpringBean"> धन्यवाद – Dimman

+1

मैं इसे WebApplicationContext ctx समाधान के साथ काम करने की है। मैं सिर्फ अगर मैं इसे छोड़ और @ManagedProperty इस्तेमाल कर सकते हैं सोच रहा था (value = "# {mySpringBean}") प्रत्यक्ष :) – Dimman

3

मान लें आप web.xml और applicationContext.xml में ठीक से वसंत कॉन्फ़िगर किया है। चेहरे-config.xml में निम्नलिखित प्रविष्टि बनाने

<application> 
    <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver> 
</application> 

आपका नमूना ऊपर दिए गए कोड ठीक लग रहा है। उपर्युक्त प्रविष्टि के साथ क्या होगा, प्रबंधित संपत्ति को पहली बार जेएसएफ द्वारा प्रबंधित बीन्स में देखा जाएगा यदि वसंत द्वारा प्रबंधित बीन्स में नहीं मिलेगा। आपके वसंत बीन में उचित एनोटेशन चिह्नित होना चाहिए और @ManagedProperty में दिया गया नाम बीन को दिए गए डिफ़ॉल्ट/नाम से मेल खाना चाहिए।

जैसा कि @ बोनी द्वारा उल्लिखित है, यह आवश्यक नहीं है, यह ऑटो इंजेक्शन है। जैसा कि आप चाहें सेटिंग्स का उपयोग किया है।

एक ओर ध्यान दें: आप दृश्य गुंजाइश के लिए चयन कर रहे हैं के बाद से कृपया इस लिंक The benefits and pitfalls of @ViewScoped

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