FacesComponent的PostConstruct / Constructor

时间:2013-03-07 16:41:54

标签: jsf-2 facelets

我已经创建了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);
    }

}

2 个答案:

答案 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()