2010-10-03 21 views
9

हैलो मैं एक ViewScoped बीन उपयोग कर रहा हूँ समस्या यह है कि जब इसे कहते मैं NotSerializableException मिलता है।ViewScoped बीन कारण NotSerializableException

@ManagedBean(name="demandesBean") 
@ViewScoped 
public class DemandesBean implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @ManagedProperty(value="#{demandeService}") 
    private DemandeService demandeService; //A Spring Service 

    @ManagedProperty(value="#{loginBean}") 
    private LoginBean loginBean; 

    private DemandeVO newDemande; 

    @PostConstruct 
    public void initData() { 
     newDemande = new DemandeVO(); 
    } 

    public void doAjouterDemande(ActionListener event) { 
     demandeService.createDemande(newDemande, loginBean.getUsername()); 
     newDemande = new DemandeVO(); 
    } 

    public List<DemandeVO> getListDemande() { 
     return demandeService.getAllDemandesByUser(loginBean.getUsername()); 
    } 

    public DemandeService getDemandeService() { 
     return demandeService; 
    } 

    public void setDemandeService(DemandeService demandeService) { 
     this.demandeService = demandeService; 
    } 

    public LoginBean getLoginBean() { 
     return loginBean; 
    } 

    public void setLoginBean(LoginBean loginBean) { 
     this.loginBean = loginBean; 
    } 

    public DemandeVO getNewDemande() { 
     return newDemande; 
    } 

    public void setNewDemande(DemandeVO newDemande) { 
     this.newDemande = newDemande; 
    } 
} 

मैं निम्नलिखित अपवाद में प्राप्त करें:

यह मेरा प्रबंधित बीन के कोड है

GRAVE: Exiting serializeView - Could not serialize state: com.bull.congesJBPM.serviceImpl.DemandeServiceImpl 
java.io.NotSerializableException: com.bull.congesJBPM.serviceImpl.DemandeServiceImpl 

इस समस्या के लिए कोई भी ठीक ?? कृपया सहायता कीजिए !

+1

संकल्प के साथ, बहुत ही समान प्रश्न, यहां: http://stackoverflow.com/questions/3180963/spring-session-scoped-beans-controllers-and-references-to-ervices-in-terms-of – skaffman

उत्तर

6

एक और समस्या भी जब स्थिति सर्वर (डिफ़ॉल्ट) पर सहेजा जा रहा है, जो डिफ़ॉल्ट रूप से MyFaces राज्य की क्रमबद्धता करता है। इसकी बारी पर स्क्रैप बैकिंग बीन्स को क्रमिक करने योग्य देखने की आवश्यकता है।

इस दृष्टिकोण के पेशेवर यह है कि इतिहास वास्तव में इतिहास है। जब आप पिछले दृश्य संस्करण (बैक-बटन का उपयोग करके) पर वापस जाते हैं, तो आपको उस समय बैकिंग बीन का सटीक संस्करण मिलता है।

चोर (, इस समस्या का और असंबंधित एक प्रमुख प्रदर्शन हिट है) कि यह सेवाओं के इंजेक्शन को तोड़ने के लिए लगता है। एक ईजेबी सेवा इंजेक्शन करते समय भी वही समस्याएं होती हैं।

एक संदर्भ पैरामीटर है कि आप web.xml में डाल इस व्यवहार को निष्क्रिय करने के कर सकते हैं नहीं है:

<context-param> 
    <param-name>org.apache.myfaces.SERIALIZE_STATE_IN_SESSION</param-name> 
    <param-value>false</param-value> 
</context-param> 

http://wiki.apache.org/myfaces/Performance

देखें संयोग से, Mojarra एक समान सेटिंग है लेकिन वहाँ डिफ़ॉल्ट गलत है।

0

मैं my own question about this same problem पर इस समस्या के लिए एक समाधान तैनात, कि इस प्रकार है: एक @ManagedProperty एनोटेशन (ManagedBean आरंभीकरण पर निष्पादित) में ईएल के माध्यम से वसंत सेम इंजेक्शन लगाने के बजाय, आप सेम रनटाइम पर ईएल का मूल्यांकन प्राप्त करते हैं।

इस दृष्टिकोण के साथ

, अपने JSF सेम इस तरह दिखना चाहिए:

@ManagedBean(name="demandesBean") 
@ViewScoped 
public class DemandesBean implements Serializable { 
    private static final long serialVersionUID = 1L; 

    private static DemandeService demandeService() { 
     return SpringJSFUtil.getBean("demandeService"); 
    } 

    // ... 
    public void doAjouterDemande(ActionListener event) { 
     demandeService().createDemande(newDemande, loginBean.getUsername()); 
     newDemande = new DemandeVO(); 
    } 
    // ... 

और यहाँ इसका इस्तेमाल किया उपयोगिता वर्ग SpringJSFUtil.java है:

import javax.faces.context.FacesContext; 

public class SpringJSFUtil { 

    public static <T> T getBean(String beanName) { 
     if (beanName == null) { 
      return null; 
     } 
     return getValue("#{" + beanName + "}"); 
    } 

    @SuppressWarnings("unchecked") 
    private static <T> T getValue(String expression) { 
     FacesContext context = FacesContext.getCurrentInstance(); 
     return (T) context.getApplication().evaluateExpressionGet(context, 
       expression, Object.class); 
    } 
} 

यह वसंत सेम संपत्ति समाप्त (कुछ और ईएल मूल्यांकन करने की लागत पर), इस प्रकार संपत्ति को पहले स्थान पर रखने के क्रमिकरण मुद्दों से परहेज करते हैं। ViewScoped सेम में

0

सब कुछ ViewState में संग्रहित है। आप सत्र में व्यूस्टेट क्रमबद्धता को बंद कर सकते हैं, लेकिन सत्रों को स्वयं क्रमबद्ध किया जा सकता है और फिर समस्या अन्य जगह पर आ जाएगी।

वसंत के साथ समाधान Serializable प्रॉक्सी का उपयोग करना है।

<aop:scoped-proxy proxy-target-class="true"/> 

वसंत सेम, प्रॉक्सी में लिपटे रहे हैं कि serializable है, और लिपटे संदर्भ क्षणिक होता है, तो यह अक्रमांकन के बाद वसंत संदर्भ से फिर से पढ़ रहा है।

यह तकनीकी रूप से elias उत्तर के समान है, केवल आपको प्रत्येक बीन के लिए कोड को लिखने की आवश्यकता नहीं है। आप एओपी का उपयोग करते हैं।

अधिक जानकारी के लिए आप मेरा प्रश्न: JSF beans and serializability issue देख सकते हैं।

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