2

我已经创建了我想在构造函数/后构造函数中初始化的 FacesComponent。问题是那里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);
    }

}
4

2 回答 2

4

您需要在encodeAll()方法中执行工作。它在渲染响应期间调用,当组件即将被渲染时。

@Override
public void encodeAll(FacesContext context) throws IOException {
    // Here.

    super.encodeAll(context);
}

鉴于您从 扩展UINamingContainer,您很可能正在为复合组件创建支持组件。在这种情况下,本文应该为您提供有用的入门知识:具有多个输入字段的复合组件


与具体问题无关,访问组件中的数据库是一种气味。而是将一个完整的Article实例作为组件值而不是它的 ID 传递。组件/渲染器应该只处理基于模型的前端 (HTTP/HTML) 内容,而不是后端 (DB/SQL) 内容。您应该准确地为组件提供它需要使用的模型。

于 2013-03-14T01:49:18.673 回答
0

就像@BalusC 说的那样。但是,如果您使用 PrimeFaces,则必须覆盖该encodeBegin()方法。否则你可能会覆盖encodeAll().

于 2020-12-04T08:27:49.237 回答