JSF PrimeFaces ViewScope без вызова init()

Я столкнулся с проблемой, используя Primefaces dataTable, которая заключается в том, что jsf вызывает мой управляемый компонент init(), который выполняет поиск в базе данных.

В моем jsf пользователь может выполнить другой поиск, который передает аргумент в String.

<p:commandButton id="btnChild" type="Submit" icon="ui-icon-plus" styleClass="action-buttons" value="Child" update=":frmSysMenu:messages dtSysMenu" ajax="false" action="#{Controller.doParent('C')}" process="dtSysMenu" />

мой управляемый компонент может выполнить doParent(String) и снова вернется к экрану поиска, но как только мой экран загрузится, он вызовет init(), который:

@PostConstruct
@Override
public void init(){
    try {
        doSearch(nodeValue,"root");
        setParentNode(nodeValue);

    } catch (Exception e) {
        addErrorMessage(e.getMessage());
        e.printStackTrace();
       Messages.addGlobalError(e.getMessage());
        LOG.error(e.toString(), e);
    }

}

и он вернется к первому запросу. есть ли другой способ, который я могу сделать?

Помогает ли RequestScoped?


person Mr Kids    schedule 28.01.2014    source источник
comment
Добро пожаловать в Stackoverflow! Если вы решили свою проблему (поздравляю), опубликуйте ее как ответ. Это помогает другим быстро понять, что ваша проблема решена.   -  person mabi    schedule 28.01.2014
comment
Большое спасибо! Извините, я новичок, и спасибо за совет :D   -  person Mr Kids    schedule 17.02.2014
comment


Ответы (1)


Из спецификаций (или где-то еще, ОП не упомянул об этом)

@ViewScoped
Компонент в этой области существует, пока вы взаимодействуете с одним и тем же представлением JSF в окне/на вкладке браузера. Он создается по HTTP-запросу и уничтожается, когда вы выполняете обратную передачу в другое представление. Он не сразу уничтожается, когда вы покидаете/закрываете представление с помощью запроса GET, но он больше не доступен обычным способом. JSF сохраняет bean-компонент в UIViewRoot#getViewMap() с именем управляемого bean-компонента в качестве ключа, который, в свою очередь, сохраняется в сеансе. Вам необходимо возвращать значение null или void из методов действия (прослушивателя), чтобы поддерживать работу компонента. Используйте эту область для более сложных форм, которые используют ajax, таблицы данных и/или несколько визуализированных/отключенных атрибутов, состояние которых необходимо. для сохранения в последующих запросах в том же окне/вкладке браузера (представление).

в функции я просто меняю на void, и jsf больше не будет вызывать init().

person Kukeltje    schedule 14.01.2016