我已经创建了FacesComponent,我想在构造函数/ postconstructor中进行初始化。问题是getAttributes()
在那里是空的。以下是示例。
@FacesComponent("articleComponent")
public class ArticleFacesComponent extends UINamingContainer {
private Article article;
public ArticleFacesComponent() {
Object idObj = getAttributes().get("articleId"); // I want to get article id to initialize object but getAttributes() is empty
...
article = em.find(Article.class, id);
}
}
答案 0 :(得分:3)
您需要使用encodeAll()
方法执行该作业。它是在渲染响应期间调用的,当组件即将被渲染时。
@Override
public void encodeAll(FacesContext context) throws IOException {
// Here.
super.encodeAll(context);
}
鉴于您从UINamingContainer
延伸,您最有可能为composite component创建支持组件。在这种情况下,本文应为您提供有用的入门见解:composite component with multiple input fields。
无关,访问组件中的数据库是一种气味。而是将完整的Article
实例作为组件值而不是其ID传递。组件/渲染器应该只处理基于模型的前端(HTTP / HTML)内容,而不是后端(DB / SQL)内容。您应该为组件提供所需的模型。
答案 1 :(得分:0)
就像@BalusC所说。但是,如果您使用的是PrimeFaces,则必须覆盖encodeBegin()
方法。否则,您可能会覆盖encodeAll()
。