Почему @PostConstruct обратный вызов стреляет каждый раз даже при том, что боб является @ViewScoped? JSF

Я использую таблицу данных на странице и использую обязательный атрибут для привязки его с моим бобом поддержки. Это - мой код:-

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:p="http://primefaces.prime.com.tr/ui">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
            <h:form prependId="false">

                <h:dataTable var="item" value="#{testBean.stringCollection}" binding="#{testBean.dataTable}">
                    <h:column>
                        <h:outputText value="#{item}"/>
                    </h:column>
                    <h:column>
                        <h:commandButton value="Click" actionListener="#{testBean.action}"/>
                    </h:column>
                </h:dataTable>

            </h:form>

    </h:body>
</html>

Это - мой боб:-

package managedBeans;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.component.html.HtmlDataTable;

@ManagedBean(name="testBean")
@ViewScoped
public class testBean implements Serializable {

    private List<String> stringCollection;

    public List<String> getStringCollection() {
        return stringCollection;
    }

    public void setStringCollection(List<String> stringCollection) {
        this.stringCollection = stringCollection;
    }

    private HtmlDataTable dataTable;

    public HtmlDataTable getDataTable() {
        return dataTable;
    }

    public void setDataTable(HtmlDataTable dataTable) {
        this.dataTable = dataTable;
    }

    @PostConstruct
    public void init(){
        System.out.println("Post Construct fired!!");
        stringCollection = new ArrayList<String>();
        stringCollection.add("a");
        stringCollection.add("b");
        stringCollection.add("c");

    }

    public void action(){
        System.out.println("Clicked!!");

    }
}

Скажите мне, почему @PostConstruct стреляет каждый раз, когда я нажимаю на кнопку? Это должно стрелять только однажды, пока я нахожусь на той же странице beacause, мой боб является @ViewScoped. Далее, если я удаляю обязательный атрибут затем, все хорошо работает, и @PostConstruct обратный вызов стреляет только однажды. Затем, почему каждый раз, когда я использую обязательный атрибут? Я нуждаюсь в обязательном атрибуте и хочу выполнить задачи инициализации как выбирающие данные из веб-сервиса, и т.д. только однажды.Что мне делать? Где я должен записать свою задачу инициализации?

32
задан BalusC 2 October 2015 в 22:04
поделиться

1 ответ

Интересно, что когда вы используете привязку компонента к bean-компоненту с областью видимости, область видимости прерывается.

Я не уверен, что это ошибка JSF2, мне нужно сначала прочитать всю спецификацию JSF2. На данный момент лучше всего отказаться от привязки компонента и передать выбранный элемент с помощью нового синтаксиса аргументов метода EL 2.2:

<h:dataTable var="item" value="#{testBean.stringCollection}">
    <h:column>
        <h:outputText value="#{item}"/>
    </h:column>
    <h:column>
        <h:commandButton value="Click" action="#{testBean.action(item)}"/>
    </h:column>
</h:dataTable>

См. Также:


Обновление (декабрь 2012 г.): это действительно ошибка в JSF2. Это проблема курицы и яйца. Компоненты с областью просмотра хранятся в состоянии просмотра JSF. Таким образом, bean-компоненты с областью просмотра доступны только после фазы восстановления. Однако атрибут привязки выполняется во время фазы восстановления просмотра, в то время как bean-компоненты с областью просмотра еще не доступны. Это вызывает создание нового экземпляра bean-компонента с областью просмотра, который затем заменяется реальным bean-компонентом с областью просмотра, который был сохранен в восстановленном состоянии представления JSF.

Об этом сообщается как проблема JSF 1492 и проблема спецификации JSF 787 , которая будет исправлена ​​для JSF 2.2. А до тех пор лучше всего использовать привязку исключительно для bean-компонентов с ограниченным объемом запроса или искать альтернативные способы выполнения конкретных функциональных требований.


Обновление (март 2015 г.): исправление JSF 2.2 было перенесено в Mojarra 2.1.18. Так что, если вы все еще используете JSF 2.0 / 2.1, вам лучше обновить хотя бы до этой версии. См. Также a.o. Что такое связывание компонентов в JSF? Когда это предпочтительнее использовать? и JSTL в JSF2 Facelets ... имеет смысл?

33
ответ дан 27 November 2019 в 21:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: