2012-02-20 10 views
6

मैं एक जेएसएफ 2/प्राइमफेस ऐप विकसित कर रहा हूं और मुझे इस घटक के बैकिंग बीन में एक समग्र घटक के इंटरफ़ेस में परिभाषित विशेषताओं तक पहुंचने में समस्या हो रही है। इस प्रकारबैकिंग घटक में जेएसएफ 2 समग्र घटक विशेषताओं तक पहुंच

मेरे घटक परिभाषित किया गया है: application/src/main/webapp/resources/my_component निर्देशिका:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:composite="http://java.sun.com/jsf/composite"> 

<composite:interface componentType="testComponent"> 
    <composite:attribute name="text" required="true" type="java.lang.String" /> 
</composite:interface> 

<composite:implementation> 

    <h:outputText value="Passed text is: #{cc.attrs.text}" /> 

</composite:implementation> 

</html> 

यह text.xhtml कहा जाता है में स्थित एक फ़ाइल में संग्रहीत किया जाता है।

मैं बहुत की तरह एक और पेज (जो एक Facelets रचना तत्व है) पर इस घटक का उपयोग करें:

package my.application.component; 

import javax.faces.component.FacesComponent; 
import javax.faces.component.UINamingContainer; 

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 

@FacesComponent (value="testComponent") 
public class TestComponent extends UINamingContainer { 
    Logger log = LoggerFactory.getLogger(TestComponent.class); 

    public TestComponent() { 
     log.debug("TestComponent constructor"); 
     log.debug("getAttributes().size(): " + getAttributes().size()); 
    } 
} 

घटक खुद के रूप में काम करता है:

<ui:composition xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:myc="http://java.sun.com/jsf/composite/my_component" 
    template="./resources/templates/template.xhtml"> 

<ui:define name="content"> 
    <h:form id="products"> 
     <myc:test id="test" text="A text" /> 
    </h:form> 
</ui:define>  

</ui:composition> 

समर्थन घटक वर्ग इस प्रकार परिभाषित किया गया है अपेक्षित होना। उपयोग पृष्ठ Passed text is: A text आउटपुट प्रस्तुत करता है। इसके अलावा, लॉगर आउटपुट TestComponent कन्स्ट्रक्टर से लॉग संदेश प्रदर्शित करता है, इसलिए ऐसा लगता है कि घटक xml परिभाषा TestComponent कक्षा के साथ सही ढंग से बाध्य है।

अब, समस्या कि getAttributes() विधि हमेशा TestComponent निर्माता में लागू एक शून्य आकार नक्शा देता है। यदि मैं यह सही ढंग से समझ, मैं text विशेषता एक फोन का उपयोग कर घटक के इंटरफ़ेस में घोषित उपयोग करने में सक्षम होना चाहिए:

getAttributes().get("text");

TestComponent कक्षा में

, लेकिन यह हमेशा null रिटर्न के रूप में विशेषताओं नक्शा खाली है।

मैं भी एक फोन का उपयोग कर text विशेषता पहुँचने का प्रयास किया:

String text = FacesContext.getCurrentInstance().getApplication(). evaluateExpressionGet(FacesContext.getCurrentInstance(), "#{cc.attrs.text}", String.class));

लेकिन यह भी null को हल करता है।

मैं क्या गलत कर रहा हूं? किसी भी सुझाव की बहुत सराहना की जाएगी क्योंकि मुझे नहीं पता कि आगे क्या प्रयास करना है।

/तुकाज़।

उत्तर

5

मेरा अनुमान है कि निर्माता उन विशेषताओं का संदर्भ देने के लिए बहुत जल्दी है।

जेएसएफ पहले बैकिंग घटक का एक उदाहरण बनाएगा, और फिर किसी बिंदु पर इसे इसके गुणों का संदर्भ देगा। एक विधि में जिसे बाद में कहा जाता है, उदाहरण के लिए एन्कोड विधि, आपको उनकी पहुंच होनी चाहिए।

+0

हाय माइक। धन्यवाद। मैं इसे आज़मा दूंगा और जांच करूंगा कि गुण 'एनकोड' विधि में पहुंच योग्य हैं या नहीं। –

+0

हाय फिर से। हाँ। गुण 'एन्कोड [ऑल | शुरुआत | अंत | चाइल्डन] (फेसस्टेन्टेक्स्ट संदर्भ)' विधियों में उपलब्ध हैं। मदद के लिए बहुत - बहुत धन्यवाद। लेकिन मुझे अभी भी आश्चर्य है कि यदि इनमें से एक तरीका गुणों तक पहुंचने का सही स्थान है, तो मैं अपने घटक को प्रस्तुत करने से पहले किसी भी तरह से उनका उपयोग करना चाहता हूं। इस तरह के उद्देश्य के लिए '@ प्रबंधित बीन 'में मैं @ पोस्ट पोस्टस्ट्रक्चर विधियों का उपयोग करता हूं, लेकिन ऐसा लगता है कि यह' @ फेस कॉम्पोनेंट 'कक्षा में काम नहीं करता है। –

+2

शायद किसी के लिए अनुरोध दर्ज करना चाहिए? '@ फेस कॉन्स्टेंट' में '@ पोस्टकॉन्स्ट्रक्चर' बहुत अच्छा होगा! –