Почему @postconstruct обратный вызов огонь каждый раз, хотя bean @viewscoped? Jsf.

StackOverflow https://stackoverflow.com/questions/2797231

Вопрос

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

<?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!!");

    }
}

Пожалуйста, скажите мне, почему @postconluct стрельба каждый раз, когда я нажимаю на кнопку? Это должно стрелять только один раз, если я на той же странице, потому что моя бобина @viewscoped. Кроме того, если я удалю атрибут привязки, то все работает нормально, а @postconstruct обратный вызов срабатывает только один раз. Тогда почему каждый раз, когда я использую связывающий атрибут? Мне нужен атрибут привязки и хотите выполнить задачи инициализации, такие как данные для получения данных из WebService, и т. Д. Только один раз. Что я должен делать? Где я должен написать свою задачу инициализации?

Это было полезно?

Решение

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

Я не уверен, что это ошибка в 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. Это проблема куриного яйца. Взгляд Scoped Beans хранится в состоянии JSF View. Таким образом, вид на вылеченные фасоли доступны только после восстановления фазы представления. Однако binding Атрибут запускается во время фазы представления восстановления, в то время как представление Scoped Beans еще не доступно. Это вызывает создание совершенно нового экземпляра фасоли, который затем заменяется на фоне «Реал», который хранился в восстановленном состоянии JSF View.

Это сообщается как JSF выпуск 1492. а также JSF SPEC ISSSUE 787 который будет исправлен для JSF 2.2. До тех пор, ваша лучшая ставка - использовать binding По запросу Scoped Beans исключительно или искать альтернативные способы для конкретных функциональных требований.


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

Другие советы

Как сказал другой, я бы сказал, что лучшее, что нужно сделать, это отбросить привязку компонентов (вам не нужно здесь).

Но я бы добавил, что вы можете достичь такого же, как вы пытаетесь сделать более объектно-ориентированные мода, используя параметры действий, как это:

<h:commandButton value="Click" action="#{testBean.action(item)}"/>

... а в вашем коде Java:

  public void action(Item item){
    System.out.println("Clicked!!" + item);
}

Если у вас есть бобов ViewSocked, и если вы хотите сохранить значения, которые были введены в форме или не хотите, чтобы выстрелил постконструкции, вы должны вернуть нулю из вашего метода действий.

Если вы вернете некоторые результаты (например, недействительные), а затем укажите неверный результат на ту же страницу, используя FaceS-config.xml, то бобов ViewsScoped воссоздается и, таким образом, вызывает постконструкцию снова.

Другое решение:

  • Привязка HTMLDatatable в прибавочной форме запроса.
  • Введите этот запрос прицел бобов в фасоте представления.

SWOR JBOSS Используйте это решение для связывания компонентов JSF к компоненту охвата разговора.

Ответ Балуса мне очень помогли мне, я хотел бы сказать, что у меня была эта ошибка с версией Mojarra 2.1.7, я в настоящее время использую 2.1.29-01, выпущенный в январе-2015, и эта ошибка исправлена, моя проблема была обязательной TabView к бобов Viewsscoped. С этой версией у меня нет этой ошибки и привязки и постконструкции работает нормально. Я использую JBoss 5.2, и мне нужно использовать Mojarra 2.1.x, поэтому я надеюсь, что этот ответ поможет другим людям в той же ситуации.

http://mvnreposity.com/artifact/com.sun.faces/jsf-api/2.1.29-01. http://mvnreposity.com/artifact/com.sun.faces/jsf-impl/2.1.29-01.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top