2012-10-22 9 views
5

का निर्माण किया गया है मेरे पास उत्सुकApplicationScoped प्रबंधित बीन्स का एक गुच्छा है। उनमें से कुछ को ManagedProperty एनोटेशन द्वारा दूसरों में इंजेक्शन दिया जाता है, जो निर्भरता का पेड़ बनाते हैं। प्रत्येक निर्भर बीन निर्माण के बाद अपने माता-पिता का उपयोग करता है।उत्सुक अनुप्रयोग स्कोप्ड प्रबंधित बीन्स कई बार

हालांकि, ऐसा लगता है कि प्रत्येक इंजेक्शन के लिए एक नया उदाहरण बनाया गया है, इस प्रकार पिछले मैनिपुलेशन पूर्ववत कर दिया गया है। मेरी समझ के लिए, ApplicationScoped बीन केवल एक बार बनाया जाना चाहिए। क्या मैंने गलत समझा है या यह क्यों हो रहा है? क्या ऐसा इसलिए है क्योंकि वे उत्सुक हैं?

यहाँ एक उदाहरण है:

ParentBean.java

package example; 

import javax.annotation.PostConstruct; 
import javax.faces.bean.ApplicationScoped; 
import javax.faces.bean.ManagedBean; 

@ManagedBean(eager = true) 
@ApplicationScoped 
public class ParentBean 
{ 
    static int initCount = 0; 

    // ... 

    @PostConstruct 
    public void init() 
    { 
     ++initCount; // Will end up being between 1 and 3. Expected always 1. 

     // ... 
    } 
} 

Child1Bean.java

package example; 

import javax.annotation.PostConstruct; 
import javax.faces.bean.ApplicationScoped; 
import javax.faces.bean.ManagedBean; 
import javax.faces.bean.ManagedProperty; 

@ManagedBean(eager = true) 
@ApplicationScoped 
public class Child1Bean 
{ 
    @ManagedProperty("#{parentBean}") ParentBean parentBean; 

    public ParentBean getParentBean() 
    { 
     return parentBean; 
    } 

    public void setParentBean(ParentBean parentBean) 
    { 
     this.parentBean = parentBean; 
    } 

    @PostConstruct 
    public void init() 
    { 
     // manipulate parentBean 
    } 
} 

Child2Bean.java

package example; 

import javax.annotation.PostConstruct; 
import javax.faces.bean.ApplicationScoped; 
import javax.faces.bean.ManagedBean; 
import javax.faces.bean.ManagedProperty; 

@ManagedBean(eager = true) 
@ApplicationScoped 
public class Child2Bean 
{ 
    @ManagedProperty("#{parentBean}") ParentBean parentBean; 

    public ParentBean getParentBean() 
    { 
     return parentBean; 
    } 

    public void setParentBean(ParentBean parentBean) 
    { 
     this.parentBean = parentBean; 
    } 

    @PostConstruct 
    public void init() 
    { 
     // manipulate parentBean 
    } 
} 
+2

क्या आप एक कोड उदाहरण दे सकते हैं कि आप इसे कैसे करते हैं? –

+0

ठीक है, मैंने एक उदाहरण जोड़ा। – Spomf

+0

नहीं लगता कि मैं किसी भी परिवर्तन करना होगा, लेकिन '@ManagedProperty कोशिश (value =" # {parentBean} ")', – Daniel

उत्तर

0

मैं Mojarra 2.0 के साथ एक ही समस्या है ।एक्स। मुझे लगता है कि समस्या multithreaded जेएसएफ initilization के साथ जुड़ा हुआ है। Com.sun.faces.enableMultiThreadedStartup पैरामीटर द्वारा इसे अक्षम करने का प्रयास करें।

+0

धन्यवाद, लेकिन इसका कोई प्रभाव नहीं पड़ा। मेरा आवेदन मोजररा 2.1.6 पर चल रहा है। – Spomf

+0

क्या आपने हल किया था? मेरी भी यही समस्या है –

1

मैंने उम्मीद की है कि इस समस्या को टॉमकैट 8 + मोजाररा 2.2.0 पर हल किया गया है। मेरे मामले में मैं सिर्फ web.xml से श्रोता घोषणा हटाया

<listener> 
    <listener-class>com.sun.faces.config.ConfigureListener</listener-class> 
</listener> 

निर्माता एक बार बाद में कहा जा रहा है।

श्रोता प्रविष्टि के बारे में, this प्रश्न के बलससी उत्तर का एक हिस्सा है।

किसी भी मामले में, web.xml में Mojarra के ConfigureListener की स्पष्ट पंजीकरण वास्तव में इस तरह ग्लासफिश v3 और जेट्टी जो Mojarra के टीएलडी फ़ाइल में श्रोता को खोजने में असफल के रूप में वर्ष गाड़ी सर्वर वैकल्पिक हल के लिए केवल आवश्यक है। एक सभ्य सर्वर पर तैनात किए जाने पर, पूरी प्रविष्टि अनावश्यक है।

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