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.
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. –
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'. –
Có lẽ ai đó nên gửi yêu cầu cho điều đó? '@ PostConstruct' trong' @ FacesComponent' sẽ tuyệt vời! –