2012-08-08 9 views
8

मैं JSF 2.0 में एक कस्टम घटक निर्माणJSF 2 कस्टम विशेषता मान के लिए अभिव्यक्ति भाषा होने घटकों विशेषता सेटर

टैग इस तरह दिखता है ट्रिगर नहीं करते :

@FacesComponent("a.b.c.MyTag") 
public class UIMyTag extends UIInput { 

    private String name; 
    private String id; 

    public String getId() { 
     return id; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 


    public String getId() { 
     return id; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    @Override 
    public void encodeBegin(FacesContext context) throws IOException { 
     ResponseWriter writer = context.getResponseWriter(); 
     logger.debug(getName()); //prints null for name="#{dummyBean.name}" 
           // and AAA for name="AAA" 
     logger.debug(getAttributes().get("name")); // always correct value 
    ... 
} 
    .... 

} 

अगर मैं का उपयोग

<x:myTag id="1" name="AAA" /> 

सब कुछ अपेक्षित के रूप में काम करता है, लेकिन जब मैं myTag के लिए ईएल का उपयोग करता हूं तो setName() विधि को कभी भी कॉल नहीं किया जाता है। के लिए तो,

<x:myTag id="#{dummyBean.id}" name="#{dummyBean.name}" /> 

मैं हमेशा name संपत्ति मेरी encodeBegin विधि के अंदर के लिए null मिलता है। डिबगिंग के बाद मैंने देखा है कि setName विधि कभी भी कॉल नहीं होती है। मैंने सोचा कि शायद ईएल के बारे में कुछ चीजें चीजों को गड़बड़ कर देती हैं (और मुझे अभी भी विश्वास है कि कारण उससे संबंधित है), लेकिन वास्तव में अजीब बात यह है कि id संपत्ति अच्छी काम करती है: सेटटर को बुलाया जाता है, और मूल्य की अपेक्षा होने पर अपेक्षा की जाती है शुरू करना।

मुझे यह उल्लेख करना होगा कि अगर मैं encodeBegin विधि से getAttributes().get("name") पर कॉल करता हूं तो मुझे सही नाम मान मिलता है, लेकिन मुझे लगता है कि यह गेटर और सेटर के साथ क्यों काम नहीं करता है।

कोई भी विचार जो मेरे घटक में गुम है?

उत्तर

12

यह व्यवहार अपेक्षित है और विनिर्देशन द्वारा किया जाता है। विशेषता मान जो मान अभिव्यक्ति हैं UIComponent#setValueExpression() द्वारा निर्धारित किए गए हैं। अर्थात् उन्हें मूल्यांकन किया जाना चाहिए जब वे वास्तव में उपयोग किए जाते थे, आमतौर पर समय प्रस्तुत करने के दौरान।

id (और binding) विशेषता विशेष उपचार है: यह से पहले दृश्य का निर्माण समय दौरान मूल्यांकन किया जाता है उसे सेट किया है, इसलिए "नियमित" सेटर (setValueExpression() के बजाय कहा जा सकता है क्योंकि देखने का प्रतिपादन अन्यथा दुर्घटना जब id (या binding) गुण कुछ कारणों से दृश्य निर्माण समय के दौरान गतिशील रूप से एक अलग मूल्य के मूल्यांकन का मूल्यांकन करता है)।

स्थानीय गुणों के बजाय गेटर्स/सेटर्स को UIComponent#getStateHelper() पर सौंपना बेहतर है। setValueExpression() अंततः StateHelper में भी समाप्त होता है (ध्यान दें कि यह सेटटर को बिल्कुल कॉल नहीं करता है; अगर आपको डेटा चाहिए तो गेटर को कॉल करें) और getAttributes()StateHelper से मानों को भी हल करता है।

public String getName() { 
    return (String) getStateHelper().eval("name"); 
} 

public void setName(String name) { 
    getStateHelper().put("name", name); 
} 

ध्यान दें कि आप सुरक्षित रूप से ,getId() और setId() विधियां निकाल सकते क्योंकि वे पहले से UIComponentBase सुपर क्लास है जो आप से विस्तार कर रहे में definied रहे हैं।

+0

उत्तर के लिए धन्यवाद! मैं यह पूछना चाहूंगा कि मुझे अपने घटक के अंदर विभिन्न प्रकार के विशेषताओं के मानों के बीच अंतर करने के लिए कुछ विशेष विधि लागू करनी है या नहीं। (मुझे समझ में आया कि UIComponentBase इसे स्वयं ही संभालता है) और यदि हां, तो ऐसा करने का सबसे अच्छा अभ्यास है ?! – RaresI

+0

नहीं और आपको आम तौर पर इसके बारे में परवाह नहीं करना चाहिए।(मूल्यांकन) विशेषता मान प्राप्त करने के लिए, केवल गेटर को आमंत्रित करें। – BalusC

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