2013-03-07 4 views
1

Я создал FacesComponent, который я хочу инициализировать в конструкторе/постконструкторе. Проблема в том, что getAttributes() пуста. Ниже приведен пример.PostConstruct/Constructor for FacesComponent

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

} 

ответ

3

Вы должны выполнить задание в методе encodeAll(). Он вызывается во время ответа рендеринга, когда компонент должен быть визуализирован.

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

    super.encodeAll(context); 
} 

Учитывая, что вы расширяете от UINamingContainer, вы, скорее всего, создание компонента основы для composite component. В этом случае эта статья должна предоставить вам полезную информацию для начала работы: composite component with multiple input fields.


Несвязанные к конкретной проблеме, доступ к БД в компоненте запах. Скорее передайте полнофункциональный экземпляр Article как значение компонента вместо его идентификатора. Компонент/рендеринг должен иметь дело только с интерфейсом (HTTP/HTML) на основе модели, а не с back-end (DB/SQL). Вы должны предоставить компонент точно модель, с которой ей нужно работать.

+0

Спасибо BalucS. Я обращаюсь к DB в FacesComponent, потому что хочу передать только articleId в CC (например, ''). Зачем? Потому что, если мне пришлось передать объект «Article», мне нужно будет создать его где-нибудь. 'FacesComponent' проверяет, существует ли статья с этим идентификатором, и если она не будет создана. Есть ли другой способ сделать это? – pepuch

Смежные вопросы