2012-02-20 39 views
6

Tôi đang phát triển ứng dụng JSF2/Primefaces và tôi đang gặp sự cố khi truy cập các thuộc tính được xác định trong giao diện của thành phần hỗn hợp trong bean sao lưu của thành phần này.Truy cập các thuộc tính thành phần tổng hợp JSF2 trong thành phần sao lưu

thành phần của tôi được định nghĩa như sau:

<!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> 

Nó được lưu trữ trong một tập tin gọi là text.xhtml nằm ở: application/src/main/webapp/resources/my_component thư mục.

Tôi sử dụng thành phần này trên một trang khác (đó là một yếu tố cấu Facelets) như sau:

<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> 

Lớp thành phần ủng hộ được quy định như sau:

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()); 
    } 
} 

Các thành phần chính hoạt động như kỳ vọng. Trang sử dụng hiển thị đầu ra Passed text is: A text. Ngoài ra, đầu ra của trình ghi nhật ký hiển thị các thông điệp tường trình từ nhà xây dựng TestComponent, vì vậy có vẻ như định nghĩa xml thành phần được ràng buộc chính xác với lớp TestComponent.

Bây giờ, vấn đề là phương thức getAttributes() được gọi trong số TestComponent hàm tạo luôn trả về bản đồ có kích thước bằng không. Nếu tôi hiểu được điều này một cách chính xác, tôi sẽ có thể truy cập vào text thuộc tính khai báo trong giao diện thành phần bằng cách sử dụng một cuộc gọi:

getAttributes().get("text");

trong lớp TestComponent, nhưng nó luôn luôn trả null như bản đồ thuộc tính trống.

Tôi cũng đã cố gắng để truy cập vào thuộc tính text sử dụng cuộc gọi:

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

nhưng nó cũng giải quyết để null.

Tôi đang làm gì sai? Bất kỳ lời khuyên nào cũng sẽ được đánh giá cao vì tôi không biết phải thử làm gì tiếp theo.

/Tukasz.

Trả lời

5

Tôi đoán là hàm tạo quá sớm để tham khảo các thuộc tính đó.

JSF sẽ xây dựng một thể hiện của thành phần sao lưu trước, và sau đó tại một số điểm sẽ cho nó tham chiếu đến các thuộc tính của nó. Trong một phương thức được gọi sau, ví dụ như phương thức mã hóa, bạn nên có quyền truy cập vào chúng.

+0

Xin chào Mike. Cảm ơn. Tôi sẽ thử và kiểm tra xem các thuộc tính có thể truy cập được bằng phương thức 'encode' hay không. –

+0

Xin chào một lần nữa. Vâng. Các thuộc tính có thể truy cập được trong các phương thức 'encode [All | Begin | End | Childen] (FacesContext context)'. Cảm ơn bạn rất nhiều vì sự giúp đỡ. Nhưng tôi vẫn tự hỏi liệu một trong những phương pháp này là đúng nơi để truy cập vào các thuộc tính nếu tôi muốn sử dụng chúng theo cách nào đó trước khi thành phần của tôi được hiển thị. Trong một '@ ManagedBean', tôi sử dụng các phương thức '@ PostConstruct' cho mục đích đó, nhưng điều này dường như không hoạt động trong lớp' @ FacesComponent'. –

+2

Có lẽ ai đó nên gửi yêu cầu cho điều đó? '@ PostConstruct' trong' @ FacesComponent' sẽ tuyệt vời! –

Các vấn đề liên quan